Web 开发会话技术之 -Cookie
会话
基本介绍
1. 什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个 web 资源,然
后关闭浏览器,整个过程称之为一个会话。
2. 会话过程中要解决的一些问题?
1) 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服
务器要想办法为每个用户保存这些数据
2) 例如:多个用户点击超链接通过一个 servlet 各自购买了一个商品,服务器应该想办法
把每一个用户购买的商品保存在各自的地方,以便于这些用户点结帐 servlet 时,结帐
servlet 可以得到用户各自购买的商品为用户结帐。
cookie 技术
Cookie是客户端技术,服务器把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样,web 资源处理的就是用户各自的数据了。【简单示意图】
cookie 介绍
二说 cookie
1. Cookie 是服务器在客户端保存用户的信息,比如登录名,浏览历史等, 就可以以 cookie方式保存.
2. Cookie 信息就像是小甜饼(cookie 中文)一样,数据量并不大,服务器端在需要的时候可以从客户端/浏览器读取(http 协议),可以通过图来理解
再次说明: cookie 数据是保存在浏览器的.
cookie 可以用来做啥
1. 保存上次登录时间等信息
2. 保存用户名,密码, 在一定时间不用重新登录
3. 网站的个性化,比如定制网站的服务,内容
cookie 基本使用
cookie 常用方法
1. Cookie 有点象一张表(K-V),分两列,一个是名字,一个是值,数据类型都是 String , 如图
2. 如何创建一个 Cookie(在服务端创建的)
Cookie c=new Cookie(String name,String val);
c.setMaxAge();//保存时间
3. 如何将一个 Cookie 添加到客户端
response.addCookie(c);
4. 如何读取 cookie(在服务器端读取到 cookie 信息)
request.getCookies();
cookie 底层实现机制-创建和读取 Cookie
1. 需求: 演示 Cookie 底层实现机制, 创建和读取Cookie
CreateCookie
1. /** 2. * 演示如何创建cookie,并保存到浏览器 3. */ 4. public class CreateCookie extends HttpServlet { 5. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6. System.out.println("CreateCookie 被调用..."); 7. 8. 9. //1. 创建一个Cookie对象 10. //1) username 该cookie的名字 是唯一, 可以理解成是key 11. //2) xxx : 该cookie的值 12. //3) 可以创建多个cookie,就创建了一个 13. //4) 这是cookie在服务器端, 还没有到浏览器 14. Cookie cookie = new Cookie("username", "tom"); 15. Cookie cookie2 = new Cookie("email", "tom@qq.com"); 16. 17. response.setContentType("text/html;charset=utf-8"); 18. //2. 将cookie发送给浏览器, 让浏览器将该cookie保存 19. response.addCookie(cookie); 20. response.addCookie(cookie2); 21. 22. PrintWriter writer = response.getWriter(); 23. writer.println("<h1>创建cookie成功~</h1>"); 24. writer.flush(); 25. writer.close(); 26. 27. 28. } 29. 30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 31. doPost(request, response); 32. } 33. }
访问 CreateCookie.java, 使用浏览器抓包分析 , 创建 Cookie 的底层机制
ReadCookie.java
1. /** 2. * 读取从浏览器发送来的cookie信息[底层仍然是http协议] 3. */ 4. public class ReadCookies extends HttpServlet { 5. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6. System.out.println("ReadCookies 被调用.."); 7. 8. 9. //1. 通过request对象读取cookie信息 10. Cookie[] cookies = request.getCookies(); 11. //2. 遍历cookie 12. if (cookies != null && cookies.length != 0) { 13. for (Cookie cookie : cookies) { 14. System.out.println("cookie name= " + cookie.getName() 15. + " value= " + cookie.getValue()); 16. } 17. } 18. 19. 20. 21. //3. 给浏览器返回信息 22. response.setContentType("text/html;charset=utf-8"); 23. PrintWriter writer = response.getWriter(); 24. writer.println("<h1>读取cookie信息成功~</h1>"); 25. writer.flush(); 26. writer.close(); 27. } 28. 29. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30. doPost(request, response); 31. } 32. }
访问 ReadCookie.java, 使用浏览器抓包分析 读取 Cookie 的底层机制.
不同会话,jsessionid 不同
代码
读取指定 Cookie
1. public class ReadCookieByNameServlet extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. //System.out.println("ReadCookieByNameServlet 被调用.."); 4. 5. //得到指定的cookie的value 6. //1. 先得到浏览器携带的所有cookie 7. Cookie[] cookies = request.getCookies(); 8. //2. 使用工具类来获取指定的cookie 9. Cookie emailCookie = CookieUtils.readCookieByName("username", cookies); 10. if(null != emailCookie) { 11. System.out.println("得到cookie name=" + emailCookie.getName() 12. + " value= " + emailCookie.getValue()); 13. } else { 14. System.out.println("sorry, 没有这个cookie"); 15. } 16. 17. //3. 给浏览器返回信息 18. response.setContentType("text/html;charset=utf-8"); 19. PrintWriter writer = response.getWriter(); 20. writer.println("<h1>完成读取cookie的任务..</h1>"); 21. writer.flush(); 22. writer.close(); 23. } 24. 25. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26. doPost(request, response); 27. } 28. }
工具类
1. public class CookieUtils { 2. 3. //编写一个方法,返回指定名字的cookie值 4. public static Cookie readCookieByName(String name, Cookie[] cookies) { 5. 6. //判断传入的参数是否正确 7. if (name == null || "".equals(name) || cookies == null || cookies.length == 0) { 8. return null; 9. } 10. //遍历cookies 11. for (Cookie cookie : cookies) { 12. if(name.equals(cookie.getName())) { 13. return cookie; 14. } 15. } 16. return null; 17. } 18. }
-修改 Cookie
1. public class UpdateCookie extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. System.out.println("UpdateCookie 被调用..."); 4. 5. //需求 6. /** 7. * 1. 需求 演示如何修改Cookie 8. * 1) 给定一个cookie的name, 找到该cookie, 如果找到, 则修改该cookie的值为 -hi 9. * 2) 如果找不到指定的cookie , 则提示, 没有该cookie 10. */ 11. //1. 根据name 去查找 cookie 12. String cookieName = "emailx"; 13. Cookie[] cookies = request.getCookies(); 14. 15. //如果我们直接创建了一个同名的cookie也相当于修改 16. Cookie userNameCookie = new Cookie("username", "hahaha"); 17. 18. 19. Cookie cookie = CookieUtils.readCookieByName(cookieName, cookies); 20. if (null == cookie) {//在该浏览器没有email cookie 21. System.out.println("当前访问 服务端的 浏览器没有 该cookie"); 22. } else { 23. cookie.setValue("hi"); 24. } 25. System.out.println("=====修改后的cookies信息======="); 26. //2. 编写cookie 27. for (Cookie cookie1 : cookies) { 28. System.out.println("cookie name= " + cookie1.getName() 29. + " value= " + cookie1.getValue()); 30. } 31. 32. //3. 给浏览器返回信息 33. response.setContentType("text/html;charset=utf-8"); 34. //4. 如果希望我们的浏览器本地的cookie也修改,则需要使用response.addCookie(cookie); 35. if(cookie != null) { 36. response.addCookie(cookie); 37. } 38. //把 新创建的userNameCookie 重新保存到浏览器 39. //如果 保存的userNameCookie 和已经有的cookie同名,就等价于替换. 40. if(userNameCookie != null) { 41. response.addCookie(userNameCookie); 42. } 43. PrintWriter writer = response.getWriter(); 44. writer.println("<h1>完成修改cookie的任务..</h1>"); 45. writer.flush(); 46. writer.close(); 47. } 48. 49. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 50. doPost(request, response); 51. } 52. }