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

目录
  • 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>

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

(0)

相关推荐

  • Springboot2 session设置超时时间无效的解决

    问题: 今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效. 解决方案: server.*属性用于控制Spring Boot使用的嵌入式容器 . Spring Boot将使用ServletWebServerFactory实例之一创建servlet容器的实例. 这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等). 当应用程序作为war文件部署到Tomcat实例时, server.*属性

  • SpringBoot2.x设置Session失效时间及失效跳转方式

    目录 设置Session失效时间及失效跳转 Session失效后如何跳转到Session失效地址 设置Session失效的几种方式 如果是1.5.6版本 还可以设置 设置Session失效时间及失效跳转 #Session超时时间设置,单位是秒,默认是30分钟  server.servlet.session.timeout=10 然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个     private long getSessio

  • springboot项目如何设置session的过期时间

    目录 这里我们只介绍springboot2.0的session时间设置 下面这种方式是设置24小时的 或者使用第二种方式 springboot设置session失效的几种方式 如果是1.5.6版本 第二个 第三个 这里我们只介绍springboot2.0的session时间设置 Duration转换字符串方式,默认为正,负以-开头,紧接着P,(字母不区分大小写)D :天 T:天和小时之间的分隔符 H :小时 M:分钟 S:秒 每个单位都必须是数字,且时分秒顺序不能乱. 例如PT10M,就是设置为

  • 详解springmvc控制登录用户session失效后跳转登录页面

    springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下: 第一步,配置 web.xml <session-config> <session-timeout>15</session-timeout> </session-config> 第二步,配置spring-mvc.xml <!-- Session失效拦截 --> <mvc:interceptors> <!-- 定义拦截器 --> <

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

    目录 Springboot2.x的session和cookie有效期 背景 项目问题解释 最后解决办法为 升级springboot2.x踩过的坑--跨域导致session问题 什么是跨域?   场景   总结 解决方案 Springboot2.x的session和cookie有效期 session和cookie的相关区别和联系就不介绍了,这里就记录一下笔记. 背景 最近在做单点登录CAS的问题,在后端塞一个cookie uid用于前端的登录拉起,并且设置了max-age, 但是测试的时候,一直有

  • 带你了解session和cookie作用原理区别和用法

    Cookie概念 在浏览某些 网站时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户,实现用户自定义功能. 是否设置过期时间: 如果不设置 过期时间,则表示这个 Cookie生命周期为 浏览器会话期间 , 只要关闭浏览器,cookie就消失了.       这个生命期为浏览会话期的cookie,就是会话Cookie; 存储:          一般保存在内存,不在硬盘;       如果设置了过期时间, 浏览器会把cookie保存在硬盘上,关闭再打开浏览器, 这些cookie依然有效直到

  • PHP根据session与cookie用户登录状态操作类的代码

     1.用户登录状态操作类UserLogin <?php final class UserLogin { public function __construct() { } public static function getUserInfo() { if (isset($_COOKIE["user_id"])&&$_COOKIE["user_id"]&&(trim($_COOKIE["user_id"])!=

  • PHP会话控制:Session与Cookie详解

    本文介绍了PHP会话控制,主要阐述以下几点内容: • 会话控制的产生背景/概念 • cookie的维护与生命周期(有效时间) • session的维护与生命周期(回收机制) • cookie与session之间的区别与联系 • 问题1:禁用cookie后session为什么会失效? • 问题2:IE浏览器下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器正常) • session.cookie简单实例 理解会话控制的概念 理解一个概念就需要理解他的背景及产生

  • php session和cookie使用说明

    1. PHP的COOKIE cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制.PHP在http协议的头信息里发送cookie, 因此setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对header() 函数的限制类似.1.1 设置cookie: 可以用setcookie() 或setrawcookie() 函数来设置cookie.也可以通过向客户端直接发送http头来设置. 1.1.1 使用setcookie()函数设置cookie: bool setco

  • PHP中Session和Cookie是如何操作的

    Session PHP的$_SESSION可以存储当前用户数据信息,用户访问WEB网站的时候,PHP会给每个访问的用户创建一个session ID,该ID是唯一ID,保存在客户机上,而用户的会话数据是保存到服务端的,PHP可以对每个不同的用户信息进行存储,当会话过期后,用户session信息也会失效. 使用Session,在使用PHP session时,一定要在页头加上session_start(),告诉服务器开始使用session了,而且在它之前应该没有任何输出,否则会报错. <?php se

  • nginx cookie有效期讨论小结

    每一次访问都会在浏览器生成Cookie,那么Cookie的存在对于用户来说是好还是坏呢?说实话,这玩意的存在确实会带来一系列的问题,有趣的是几乎每个站点都难以离开Cookie,由于Cookie的使用因其貌似简单,而很容易被人轻视.最近在开发过程中,审视应用中的Cookie代码,几乎只需要很小的代价就可以获得巨大的安全收益.因此写下这份笔记加深记忆. cookie的安全隐患 在实际的应用场景中,Cookie被用来做得最多的一件事是保持身份认证的服务端状态.这种保持可能是基于会话Session的,也

  • 一文彻底理清session、cookie、token的区别

    目录 前言 1.为什么会有它们? 2.什么是 cookie? 3.什么是 session? 4.cookie 和 session 的区别? 5.token 是什么? 总结 附:cookie/session的联系 前言 今天就来理一理session.cookie.token这三者之间的关系! 1.为什么会有它们? 我们都知道 HTTP 协议是无状态的,所谓的无状态就是客户端每次想要与服务端通信,都必须重新与服务端链接,意味着请求一次客户端和服务端就连接一次,下一次请求与上一次请求是没有关系的. 这

  • thinkphp中session和cookie无效的解决方法

    本文实例讲述了thinkphp中session和cookie无效的解决方法.分享给大家供大家参考.具体分析如下: 问题描述: 在本地调试时session和cookie是用没有问题的,我是用session保存当前登录账户的信息,上传服务器之后,发现跳转之后session不复存在,为什么呢?在当前页面输出session是存在的. 遇到这个问题三天了,因为是自学没有老师可以请教,身边也没有几个是弄PHP的,所以真的是很悲剧,于是乎百度,而百度上很多人都是屁话连天,没有什么可以解决问题的,经过三天的修改

  • 对Session和Cookie的区分与解释

    对Session和Cookie的区分与理解  先说session 对SESSION的争论好象一直没有停止过,不过幺麽能理解SESSION的人应该占90以上.但还是讲讲,别嫌老~ 有一些人赞成用SESSION,有一些人不赞成.但这个问题到底要怎么说.不妨听听我的看法,如果有错误请不要朝丢东西,金条和硬币除外. 有些人应该知道我是做江湖程序的,而江湖程序做看中的就是效率,但这里不谈设计,而从一些比较实际的角度看SESSION. 首先要先说SESSION是干什么的,SESSION是可以存储针对与某一个

随机推荐