1. 客户端会话技术Cookie
- 由于是保存在浏览器中,所以相对不安全。
- 有大小限制,最大4kb。
- 每次请求会自动携带。
1.1 代码
服务端创建Cookie并加入到response中。
import jakarta.servlet.http.Cookie;
(HttpServletRequest request,HttpServletResponse response)
Cookie cookie = new Cookie("name","lab");
/** 设置过期时间
* 正数:持久化时间后删除;
* 负数:窗口关闭后删除,不会被持久化;
* 0:删除cookie数据;
* 默认-1
*/
cookie.setMaxAge(-1);
/** 该域名及其子域下共享Cookie
* 例如:aaa.lab.com与bbb.lab.com共享
*/
cookie.setDomain("lab.com");
/** 该路径及其子路径下共享 */
cookie.setPath("/");
/**
* true:浏览器端只有Https会携带该Cookie
*/
cookie.setSecure(false);
response.addCookie(cookie); // 浏览器会自动加入到Cookie中
服务端获取request中的Cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
cookie.getName();
cookie.getValue();
}
2. 服务器会话技术Session
- 保存在服务器中,安全。
- 没有大小限制。
- 通过Cookie与浏览器建立联系,保证用户在切换页面时保持会话。
2.1 代码
import jakarta.servlet.http.HttpSession;
(HttpServletRequest request,HttpServletResponse response)
/** 服务端创建或获取Session,多次获取都是同一个对象
* true:没有Session会创建
* false:没有Session返回null
*/
HttpSession session = request.getSession(true);
session.setAttribute("name","lab");
Session创建后会自动做如下处理(Session的实现依赖于Cookie)。
- 第一次创建Session对象,获得一个JSSSSIONID=***。
- 放到响应头中,Set-Cookie:JSSSSIONID=***,之后存入到浏览器的Cookie中。
- 当浏览器再次请求,请求头中,Cookie:JSESSIONID=***。
- 再次获取,会对比这个id是否存在并获取。



/** 销毁Session,默认30分钟后销毁,可以在web.xml里面设置
<session-config> -- <session-timeout>修改
*/
session.invalidate();
2.2 问题
如果想要浏览器关闭之后(原因就是JSESSIONID消失),仍然想获取相同的Session,可以自定义一个Cookie,设置JSESSIONID属性,设置存活时间,持久化保持。
Cookie c = new Cookie("JSESSIONID", session.getId());
c.setMaxAge(60 * 60);
response.addCookie(c);
如果想在服务器关闭之后,仍然想获取到和之前相同的session,可以将session序列化到硬盘,该操作tomcat已经做了。
3. 注意点
- Session的使用要求浏览器必须支持Cookie。
- Cookie与Session通常使用在前后端不分离的情况(前后端分离使用Token)。
本文内容仅代表作者的个人观点,仅供参考,读者在阅读时,应结合自身实际情况独立分析。
877

被折叠的 条评论
为什么被折叠?



