目录
一:Cookie
1:Cookie是什么?
Cookie:是浏览器在本地持久化存储数据的一种机制。
2:Cookie的数据从哪来?
Cookie的数据是浏览器返回给浏览器的。
3:Cookie的数据长啥样 ?
Cookie中是键值对中的数据,并且这些键值对中的数据都是程序员自定义的。
4:Cookie的作用
Cookie就可以在浏览器上存储临时性的数据,就是用来存储"身份标识".此处的身份标识相当于sessionId.
5:Cookie到哪里去?
Cookie中的内容会在下次访问该网站的时候,自动被带到http请求中。
6:Cookie怎么存的?
浏览器按照不同的"域名"分别存储cookie.域名和域名之间的cookie是不同的。
Cookie是存储在硬盘上。Cookie往往会有超时时间。
二:实战操作
结合Servlet,进一步的针对Cookie和Session进行一些实战操作。
2.1:Cookie操作
2.1.1:HttpServletRequest
由HttpServletRequest提供的静态方法:Cookis[] getCookies():获取的是所有的Cookie中的内容。
每一个元素相当于是一个cookie对象,对象里面包含相应的键值对。同时每一个cookie对象存在三个静态方法:
方法 描述 String getName() 获取cookie名称 String getValue() 获取cookie的值 void setValue(String newValue) 设置新的cookie的value值
2.1.2:HttpServletResponse
由于HttpServletResponse这个类是根据请求计算响应中的,提供的方法是添加cookie到响应。
void addCookie(Cookie cookie) | 把指定的cookie添加到响应中 |
2.1.3:实现案例
利用HttpServletResponse提供的静态方法addCookie添加对应的cookie(同时,将其添加到响应当中,将其添加到set-cookie当中)
利用HttpServletRequest提供的静态方法,getCookies,得到数组,打印数组cookie对象的每一个内容。
@WebServlet("/setcookie") public class setCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //期望通过doGet方法,把一个自定义的cookie数据,返回到浏览器当中 resp.addCookie(new Cookie("date","2023-09-23")); resp.addCookie(new Cookie("username","lmx")); resp.addCookie(new Cookie("password","1234")); resp.getWriter().write("setCookie ok"); } }
@WebServlet("/getcookie") public class GetCookieServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取这次请求中的cookie Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { System.out.println(cookie.getName()+":"+cookie.getValue()); } resp.getWriter().write("ok"); } }
运行结果:
2.2:Session操作
2.1.1:HttpServletRequest
HttpSession getSession() | 1:如果用户当前没有session,会创建一个sessionID 2:如果用户有session,直接获取对应的session |
2.1.2:HttpSession
Object getAttribute(String name) | 1 |
void sertAttritube(String name,Object value) | 2 |
boolean isNew() | 3 |
1:根据name,获取对应的value值
2:设置对应的name和value值
3:判断是不是创建出新的会话
对于上图进行进一步的解释:服务器会存多个用户的sessionId,即客户端保存的是自己的sessioID,服务器通过获取每个客户端的sessionID,获取每个用户所对应的value值,即attritube,再获取里面的多个值。
2.1.3:登录案例实现
登录端代码:
@WebServlet("/login")
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取用户名和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
if(username==null||password==null||username.equals("")||password.equals("")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("当前请求参数不完整");
return ;
}
//验证用户名和密码是否正确 合法的用户是zhangsan 密码是123
if(!username.equals("zhangsan")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("当前用户名错误");
return ;
}
if(!password.equals("123")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("密码错误");
return ;
}
//登录成功,此时吗,可以给这个用户创建session绘画
HttpSession session = req.getSession(true);
session.setAttribute("username",username);
session.setAttribute("time", System.currentTimeMillis());
System.out.println(session.getAttribute("password"));
//4:让页面自动跳转到页面,利用resp的重定向
resp.sendRedirect("index");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
主页端代码:
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先验证一下用户的登录状态,如果不存在的时候,返回的是null
HttpSession session = req.getSession(false);
if(session==null){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("用户未登录,请先登录再访问主页");
}
//已经登录成功了,取出之前的绘画
String username = (String) session.getAttribute("username");
long time= (long) session.getAttribute("time");
String password = (String) session.getAttribute("password");
System.out.println("用户名: "+username+"密码: "+password+" 时间戳:"+time);
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("欢迎你, "+username+"! 上次登录时间: "+time);
}
}
login.html静态页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="1" method="post">
姓名:<input type="text" name="username">
<br>
密码:<input type="password" name="password">
<br>
<input type="submit" value="登录">
</form>
</body>
</html>
运行结果: