一: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>
运行结果: