首页 > 编程知识 正文

session和cookie的生命周期,springboot cookie过期时间

时间:2023-05-06 16:42:26 阅读:285649 作者:3574

session和cookie的相关区别和联系就不介绍了,这里就记录一下笔记。

背景

最近在做单点登录CAS的问题,在后端塞一个cookie uid用于前端的登录拉起,并且设置了max-age, 但是测试的时候,一直有个问题,就是前端页面打开,不做任何操作,停留30分钟左右,然后点击按钮,按理说是应该会发送到后端,但是实际上却发生了302的跳转,前端也没有拉起登录页面,说明登录状态还在(根据uid判断),但是为什么后端日志没有打印??

也就是说,页面半小时左右没做任何操作,这个按钮就跳出了前端和后端,失去了控制,百思不得其解啊。

经过一番排查,终于发现问题了,前端的登录态判断条件,uid是后端塞进去的,并且设置了max-age为1小时,但是项目里的springboot2.x,并没有配置下面内容:

server.servlet.session.timeout= # session的有效期,默认为30minserver.servlet.session.cookie.max-age= #cookie的有效期,默认为-1 即是和浏览器关闭状态有关

后来测试了一番,在代码里add cookie和 server.servlet.session.cookie.max-age 之间的参数比较

public int test(HttpServletRequest request, HttpServletResponse response) { int maxInactiveInterval = request.getSession().getMaxInactiveInterval(); Cookie[] cookies = request.getCookies(); System.out.println("maxInactiveInterval: " + maxInactiveInterval); Cookie cookie = new Cookie("uid","koo"); cookie.setMaxAge(5); response.addCookie(cookie); return maxInactiveInterval; }

测试策略为:设置server.servlet.session.cookie.max-age 和 cookie.setMaxAge(5);的值不一样,然后在浏览器查看。

最后的结论是:server.servlet.session.cookie.max-age控制的是JESSIONID的有效期,Cookie cookie = new Cookie(“uid”,“koo”); cookie.setMaxAge(5);这种方式的cookie 特定字段的有效期是分开的。

另外一个配置:server.servlet.session.timeout表示的是session的有效期,查看源代码默认值为:30min,或者也可以这样输出session的有效期:int maxInactiveInterval = request.getSession().getMaxInactiveInterval();

项目问题解释:
我在项目里只有Cookie cookie = new Cookie(“uid”,“koo”); cookie.setMaxAge(3600);
并且是设置为3600秒的有效期,但是服务器的session有效期server.servlet.session.timeout是没有配置的,所以前端登录态判断的时候,uid是还存在的,所以发送请求的时候,不会拉起登录页面,会把请求发送出去,但是后端的session已经过期了,导致发生302的请求,请求看起来失去了控制。

最后解决办法为:
server.servlet.session.timeout=86400
server.servlet.session.cookie.max-age=86400

Cookie cookie = new Cookie(“uid”,“koo”);
cookie.setMaxAge(23*3600);
response.addCookie(cookie);

登录态字段的cookie有效期要小于session的有效期,这样就会在先于发送请求的时候,拉起登录页面了,不会再出现失去控制的情况。

谢谢,祝生活愉快。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。