Cookie与Session相关

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)。

本文内容仅代表作者的个人观点,仅供参考,读者在阅读时,应结合自身实际情况独立分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值