iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊Springboot2.x的session和cookie有效期
  • 512
分享到

聊聊Springboot2.x的session和cookie有效期

2024-04-02 19:04:59 512人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录SpringBoot2.x的session和cookie有效期背景项目问题解释最后解决办法为升级springboot2.x踩过的坑——跨域导致session问题什么是跨域?

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的有效期,这样就会在先于发送请求的时候,拉起登录页面了,不会再出现失去控制的情况。

升级springboot 2.x 踩过的坑——跨域导致session问题

目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题。

什么是跨域?   

是指浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。  

做过WEB后台的童鞋都知道,跨域这种问题是比较常见的,最近我们公司需要将springboot 1.x升级到2.x,在升级之后遇到了挺多的问题,例如某些类过时了或者某些类找不到等,还有就是今天要说得session不一致的情况(eg:请求不同接口,sessionID都不一致,即session不会共享)。

场景   

今天前端童鞋跟我说,本地环境调用校验验证码接口一直报“未获取到用户信息,请重新登录”,我直接看了下这个接口,他是从session中获取的用户信息,如果用户不存在则会抛这种提示语。


    HttpSession session = request.getSession(false);
        Object sessionObj = session.getAttribute(LOGIN_NAME);//session为空
        String currentName = null == sessionObj ? null : sessionObj.toString();
        if (StringUtils.isBlank(currentName)) {
            res.setMessage(messageUtil.getMessage("reLogin"));
            res.setStatusCode(StatusCode.RE_LOGIN.getCode());
            return res;
        }

  

因为我们登录和校验验证码是两个接口,所以用户信息是从登录放进去的,然后在验证码接口中获取用户信息做后面的进一步操作。  

看到这个之后,我看了下springboot的配置,都有配置session 共享的配置,而且我的session是放在Redis里面的,有点郁闷,然后我就登录到测试环境登录一下试试看,咦~~居然可以,最后才反应过来是跨域的问题,然后我又去看了下代码,是有配置跨域的问题,真奇怪!  

经过一天的百度与排查,我回滚到springboot 1.x居然没有这个问题,才定位到是升级到springboot 2.x导致的原因,好了,已经抓住凶手了,这下子好对症下药了,去网上看了 springboot升级到2.xspring session 相关的问题。  

终于发现了新大陆,spring-session 2.x 中 Cookie里面居然引入了SameSite 这个叼毛,他默认值是 Lax,好了咱们来看看这个是什么东西?  

SameSite Cookie 是用来防止CSRF攻击,它有两个值:Strict、Lax

  • SameSite = Strict:

意为严格模式,表明这个cookie在任何情况下都不可能作为第三方cookie;

  • SameSite = Lax:

意为宽松模式,在get请求是可以作为第三方cookie,但是不能携带cookie进行跨域post访问(这就很蛋疼了,我们那个校验接口就是POST请求)

总结

前端请求到后台,每次session都不一样,每次都是新的会话,导致获取不到用户信息

解决方案

将SameSite设置为空


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
@Configuration
public class SpringSessionConfig {
    public SpringSessionConfig() {
    }
    @Bean
    public CookieSerializer httpSessionIdResolver() {
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        // 取消仅限同一站点设置
        cookieSerializer.setSameSite(null);
        return cookieSerializer;
    }
}

pom.xml依赖


<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.4.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.session</groupId>
   <artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.session</groupId>
 <artifactId>spring-session</artifactId>
 <version>1.3.1.RELEASE</version>
</dependency>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 聊聊Springboot2.x的session和cookie有效期

本文链接: https://www.lsjlt.com/news/135907.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊Springboot2.x的session和cookie有效期
    目录Springboot2.x的session和cookie有效期背景项目问题解释最后解决办法为升级springboot2.x踩过的坑——跨域导致session问题什么是跨域?...
    99+
    2024-04-02
  • 简单聊聊vue2.x的$attrs和$listeners
    目录$attrs$listeners总结$attrs $attrs 用于多层次组件传递参数(组件标签的attribute,class和style除外),爷爷辈组件向孙子辈组件传递参数...
    99+
    2024-04-02
  • Node学习之聊聊Cookie-Session登录验证的工作原理
    为什么不单独使用Cookie?Cookie是存放在浏览器中的,可以在浏览器中打开控制台,选择应用,找到存储中的Cookie进行查看:当客户端向服务端发送网络请求时浏览器会自动将Cookie添加到请求头中,这样服务端就能获取这个Cookie,...
    99+
    2023-05-14
    Node.js node
  • 聊聊有关golang ()和.() 的转换
    Golang中的()和.()转换在Golang中,()和.()是两种非常常见的类型转换。在本篇文章中,我们将会介绍这两种类型转换的使用场景、转换规则以及相关的示例代码。()转换在Golang中,()转换是将一个非接口类型转换为一个接口类型的...
    99+
    2023-05-14
  • 聊聊JavaScript和php的区别有哪些
    JavaScript和PHP是两种不同的编程语言,它们各自有着自己的特点和用途。虽然它们都可以用于Web开发,但是它们的差异还是很大的。下面将详细介绍JavaScript和PHP之间的区别。语言类型JavaScript是一种客户端脚本语言,...
    99+
    2023-05-14
  • 怎么设置session的有效期
    在设置session的有效期之前,需要先确保您的应用程序已经启用了session功能。要设置session的有效期,您可以使用以下方...
    99+
    2023-08-18
    session
  • php中cookie和session的区别有哪些
    小编给大家分享一下php中cookie和session的区别有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器...
    99+
    2023-06-14
  • 一文聊聊Vue组件生命周期的三个阶段(创建、运行和销毁)
    总结生命周期:1)又称:生命周期回调函数、生命周期函数、生命周期钩子。2)含义:vue在关键时刻帮助我们调用一些特殊名称的函数。3)生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。4)生命周期函数中的this指向是 vm...
    99+
    2023-05-14
    Vue 组件 生命周期
  • ChatGPT和Python串联:打造高效的聊天助手
    ChatGPT和Python串联:打造高效的聊天助手引言:在如今的信息时代,人工智能技术的进步为我们的生活带来了诸多便利。而聊天机器人作为人工智能技术的一项重要应用,已经在各个领域发挥着重要作用。ChatGPT作为开源的大规模预训练语言模型...
    99+
    2023-10-26
    ChatGPT Python 聊天助手
  • js怎么实现给存储的cookie值一个有效期并让次日自动失效
    本篇内容主要讲解“js怎么实现给存储的cookie值一个有效期并让次日自动失效”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js怎么实现给存储的cookie值一...
    99+
    2024-04-02
  • localStorage设置有效期和过期时间的简单方法
    目录前言实现思路实现代码总结前言 总所周知localStorage默认是不会过期的,也没有可设置过期的api,如果要实现过期清除就需要自己实现一个api 实现思路 在Storage原...
    99+
    2024-04-02
  • C4C Product Price List的模型中和有效期相关的两个字段
    SAP C4C的price list实例可以在工作中心Products,视图Price Lists里看到。我们点开第二个名为TEST的实例:我写这篇文章的日期是2018年10月27日,我现在把这个list有效期开始和结束的时间都改成27日之...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作