Springboot2.x的session和cookie有效期

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

背景

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

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

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

server.servlet.session.timeout=   # session的有效期,默认为30min
server.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的有效期,这样就会在先于发送请求的时候,拉起登录页面了,不会再出现失去控制的情况。

谢谢,祝生活愉快。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SessionCookie 是 Web 开发中常用的两种技术,用于在客户端和服务器之间保存状态信息。 Session 是服务器端存储状态的一种机制,它通过在服务器上创建一个唯一的会话标识符(session ID)来跟踪用户的会话状态。当用户访问网站时,服务器会为该用户创建一个 session 对象,并将 session ID 存储在一个名为 session cookie 的小文件中发送给用户的浏览器。浏览器将该 session cookie 存储在客户端,并在后续的请求中将 session ID 作为参数发送给服务器。服务器通过 session ID 来识别用户,并将对应的会话状态存储在服务器内存或数据库中,以便在用户与服务器交互时进行状态管理。 Cookie 是客户端存储状态的一种机制,它是由服务器发送给客户端浏览器的一小段文本信息。浏览器将该文本信息存储在客户端,并在后续的请求中将该信息作为请求头的一部分发送给服务器。服务器通过读取请求头中的 cookie 信息来识别用户,并根据 cookie 中的数据来进行相应的处理。Cookie 可以用于记录用户的登录状态、个性化设置等信息。 SessionCookie 通常是结合使用的。服务器使用 session 来存储用户的会话状态,而 session ID 则通过 cookie 发送到客户端,客户端浏览器会将其存储起来,并在后续的请求中发送给服务器,以便服务器能够识别用户并维持会话状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值