Cookie 和 Session 傻傻分不清

CookieSession 傻傻分不清

文字有点多请耐心看😀😀😀

1.到底什么是Cookie什么是Session

CookieSession 是两个不同的概念,但它们经常一起工作以维持和管理Web应用的会话状态。它们之间的关系是这样的:

Session:这是在服务器端为每个用户或浏览器会话存储的数据。每个会话都有一个唯一的会话ID。

Cookie:当首次请求到达服务器(没有带有任何会话信息的请求)时,服务器会创建一个新的会话,并为该会话生成一个唯一的会话ID。然后,这个会话ID被发送回客户端浏览器作为一个Cookie(通常命名为JSESSIONID,至少在Java的Servlet和JSP容器中是这样)。

2.那CookieSession到底什么时候生成呢?

在Java Web应用程序中,对于用户身份验证和会话管理,通常使用HttpSession对象。此对象代表与某个客户端的会话。在背后,它与一个会话ID关联,此ID被存储在名为JSESSIONID的Cookie中。当调用HttpServletRequestgetSession()方法时,如果当前没有会话(或者会话已经超时),则会为当前用户创建一个新的会话,并生成一个新的JSESSIONID

也就是说当HttpSession对象被创建时,服务器会自动在HTTP响应中添加一个Set-Cookie头,设置JSESSIONID的值。您不需要手动创建这个Cookie,Servlet容器(如Tomcat)会为您处理。(这是在默认情况下处理)

生成方式是什么

生成时机:当首次调用request.getSession()request.getSession(true)时,如果不存在当前有效的会话,会自动为用户创建一个新的HttpSession对象并生成一个JSESSIONID。这通常在用户成功登录后的servlet处理方法(如doPostdoGet)内部发生。

当然我说这是默认情况下生成方式,还是可以通过手动设置

Cookie userCookie = new Cookie("username", "john_doe");
//设置最大生存时间(以秒为单位):
userCookie.setMaxAge(60 * 60 * 24);  // 设置Cookie的生命周期为24小时
//设置Cookie的路径:
userCookie.setPath("/some/path");
//userCookie.setDomain(".example.com");
//设置Cookie的域:
userCookie.setDomain(".example.com");
//设置HttpOnly标志(表示JavaScript无法访问此Cookie)保证Cookie安全性
userCookie.setHttpOnly(true);
//等等一些设置属性我就不一一举例了

3.客户端又是如何获取到Cookie

请求响应,需要将Cookie发送到客户端,将其添加到HTTP响应中。可以通过javax.servlet.http.HttpServletResponse对象的addCookie()方法完成此操作。

response.addCookie(userCookie);

这样在响应头部设置Set-Cookie,当浏览器接收到带有Set-Cookie头部的HTTP响应时,它会解析并存储Cookie。除非Cookie过期或被明确删除,否则它将持续存在于用户的浏览器中。

后续请求中,每当浏览器向同一域发送请求时,它都会自动在HTTP请求的Cookie头部中包含先前存储的Cookie,从而使服务器能够识别和处理特定的用户或会话。

从技术的角度来说,大多数情况下,Cookie是在处理HTTP请求时根据上述场景自动生成的。例如,当用户提交登录表单,服务器验证身份后,可能会在响应中添加一个会话Cookie。同样,当用户更改界面语言或主题时,应用可能会在响应中生成一个包含用户偏好的Cookie。

不过,值得注意的是,Java Web容器(如Tomcat)本身并不会在每个请求中自动创建Cookie,除非你使用了会话管理功能(如HttpSession),这时,容器会自动创建一个名为JSESSIONID的Cookie来跟踪用户会话。但除此之外,其他Cookie的生成完全取决于你的应用逻辑和需求。

4.下次请求服务又是如何知道回话还存在?

其实说白了就是Cookie值其实就是HttpSession对象键值,Cookie 中的 JSESSIONID 值(在 Java Web 应用中)仅仅是 Session 对象的唯一标识符。这允许服务器在后续的请求中重新获得与特定用户关联的 Session 数据。

但是,同时也需要注意,由于 HTTP 本身是无状态的,所以使用 Cookie 和 Session 是一种维护状态的方式,它可能受到某些类型的攻击(例如会话劫持)。因此,应当确保使用安全措施,如 HTTPS、避免在公共网络上暴露会话ID等,以增加安全性。

总结

  1. Cookie 中的 JSESSIONID 是 Java Web 应用中的 Session 对象的唯一标识符
  2. 实际的用户会话数据是存储在服务器端的,而非客户端。
  3. 使用 JSESSIONID,服务器可以在连续的请求中识别并提取特定用户的会话数据。
  4. 这种设计增强了安全性和效率,同时也提供了数据管理的灵活性。
  5. 虽然这种方法提供了状态维护的手段,但仍需要采取安全措施,如使用 HTTPS,来保护会话数据免受攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值