Cookie
和 Session
傻傻分不清
文字有点多请耐心看😀😀😀
1.到底什么是Cookie
什么是Session
Cookie
和 Session
是两个不同的概念,但它们经常一起工作以维持和管理Web应用的会话状态。它们之间的关系是这样的:
Session:这是在服务器端为每个用户或浏览器会话存储的数据。每个会话都有一个唯一的会话ID。
Cookie:当首次请求到达服务器(没有带有任何会话信息的请求)时,服务器会创建一个新的会话,并为该会话生成一个唯一的会话ID。然后,这个会话ID被发送回客户端浏览器作为一个Cookie(通常命名为JSESSIONID
,至少在Java的Servlet和JSP容器中是这样)。
2.那Cookie
和 Session
到底什么时候生成呢?
在Java Web应用程序中,对于用户身份验证和会话管理,通常使用HttpSession
对象。此对象代表与某个客户端的会话。在背后,它与一个会话ID关联,此ID被存储在名为JSESSIONID
的Cookie中。当调用HttpServletRequest
的getSession()
方法时,如果当前没有会话(或者会话已经超时),则会为当前用户创建一个新的会话,并生成一个新的JSESSIONID
。
也就是说当HttpSession
对象被创建时,服务器会自动在HTTP响应中添加一个Set-Cookie
头,设置JSESSIONID
的值。您不需要手动创建这个Cookie,Servlet容器(如Tomcat)会为您处理。(这是在默认情况下处理)
生成方式是什么
生成时机:当首次调用request.getSession()
或request.getSession(true)
时,如果不存在当前有效的会话,会自动为用户创建一个新的HttpSession
对象并生成一个JSESSIONID
。这通常在用户成功登录后的servlet处理方法(如doPost
或doGet
)内部发生。
当然我说这是默认情况下生成方式,还是可以通过手动设置
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等,以增加安全性。
总结
- Cookie 中的
JSESSIONID
是 Java Web 应用中的Session
对象的唯一标识符。 - 实际的用户会话数据是存储在服务器端的,而非客户端。
- 使用
JSESSIONID
,服务器可以在连续的请求中识别并提取特定用户的会话数据。 - 这种设计增强了安全性和效率,同时也提供了数据管理的灵活性。
- 虽然这种方法提供了状态维护的手段,但仍需要采取安全措施,如使用 HTTPS,来保护会话数据免受攻击。