Web 开发会话技术之 -Cookie介绍以及源码分析和图分析

简介: Web 开发会话技术之 -Cookie介绍以及源码分析和图分析


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. }


目录
相关文章
|
6天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
19 6
|
24天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
47 4
|
26天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
47 1
|
1月前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
52 2
|
2月前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
2月前
|
存储 安全 数据库
后端技术在现代Web开发中的实践与创新
【10月更文挑战第13天】 本文将深入探讨后端技术在现代Web开发中的重要性,通过实际案例分析展示如何利用先进的后端技术提升用户体验和系统性能。我们将从基础架构设计、数据库优化、安全性保障等方面展开讨论,为读者提供清晰的指导和实用的技巧。无论是新手开发者还是经验丰富的技术人员,都能从中获得启发和帮助。
40 2
|
2月前
|
机器学习/深度学习 移动开发 JavaScript
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
206 0
|
1月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
44 0
|
27天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
170 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header