欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年09月16日 11:14:34   作者:Agly_Charlie  
這篇文章主要介紹了Springboot2.x的session和cookie有效期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Springboot2.x的session和cookie有效期

session和cookie的相關(guān)區(qū)別和聯(lián)系就不介紹了,這里就記錄一下筆記。

背景

最近在做單點(diǎn)登錄CAS的問(wèn)題,在后端塞一個(gè)cookie uid用于前端的登錄拉起,并且設(shè)置了max-age, 但是測(cè)試的時(shí)候,一直有個(gè)問(wèn)題,就是前端頁(yè)面打開(kāi),不做任何操作,停留30分鐘左右,然后點(diǎn)擊按鈕,按理說(shuō)是應(yīng)該會(huì)發(fā)送到后端,但是實(shí)際上卻發(fā)生了302的跳轉(zhuǎn),前端也沒(méi)有拉起登錄頁(yè)面,說(shuō)明登錄狀態(tài)還在(根據(jù)uid判斷),但是為什么后端日志沒(méi)有打????

也就是說(shuō),頁(yè)面半小時(shí)左右沒(méi)做任何操作,這個(gè)按鈕就跳出了前端和后端,失去了控制,百思不得其解啊。

經(jīng)過(guò)一番排查,終于發(fā)現(xiàn)問(wèn)題了,前端的登錄態(tài)判斷條件,uid是后端塞進(jìn)去的,并且設(shè)置了max-age為1小時(shí),但是項(xiàng)目里的springboot2.x,并沒(méi)有配置下面內(nèi)容:

server.servlet.session.timeout=   # session的有效期,默認(rèn)為30min
server.servlet.session.cookie.max-age=  #cookie的有效期,默認(rèn)為-1 即是和瀏覽器關(guān)閉狀態(tài)有關(guān)

后來(lái)測(cè)試了一番,在代碼里add cookie和 server.servlet.session.cookie.max-age 之間的參數(shù)比較

    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;
    }

測(cè)試策略為:

設(shè)置server.servlet.session.cookie.max-age 和 cookie.setMaxAge(5);的值不一樣,然后在瀏覽器查看。

在這里插入圖片描述

最后的結(jié)論是:

server.servlet.session.cookie.max-age控制的是JESSIONID的有效期,Cookie cookie = new Cookie(“uid”,“koo”); cookie.setMaxAge(5);這種方式的cookie 特定字段的有效期是分開(kāi)的。

另外一個(gè)配置:

server.servlet.session.timeout表示的是session的有效期,查看源代碼默認(rèn)值為:30min,或者也可以這樣輸出session的有效期:int maxInactiveInterval = request.getSession().getMaxInactiveInterval();

在這里插入圖片描述

項(xiàng)目問(wèn)題解釋

我在項(xiàng)目里只有Cookie cookie = new Cookie(“uid”,“koo”); cookie.setMaxAge(3600); 并且是設(shè)置為3600秒的有效期,但是服務(wù)器的session有效期server.servlet.session.timeout是沒(méi)有配置的,所以前端登錄態(tài)判斷的時(shí)候,uid是還存在的,所以發(fā)送請(qǐng)求的時(shí)候,不會(huì)拉起登錄頁(yè)面,會(huì)把請(qǐng)求發(fā)送出去,但是后端的session已經(jīng)過(guò)期了,導(dǎo)致發(fā)生302的請(qǐng)求,請(qǐng)求看起來(lái)失去了控制。

最后解決辦法為

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

登錄態(tài)字段的cookie有效期要小于session的有效期,這樣就會(huì)在先于發(fā)送請(qǐng)求的時(shí)候,拉起登錄頁(yè)面了,不會(huì)再出現(xiàn)失去控制的情況。

升級(jí)springboot 2.x 踩過(guò)的坑——跨域?qū)е聅ession問(wèn)題

目前IT界主流前后端分離,但是在分離過(guò)程中一定會(huì)存在跨域的問(wèn)題。

什么是跨域?   

是指瀏覽器從一個(gè)域名的網(wǎng)頁(yè)去請(qǐng)求另一個(gè)域名的資源時(shí),域名、端口、協(xié)議任一不同,都是跨域?! ?/p>

做過(guò)web后臺(tái)的童鞋都知道,跨域這種問(wèn)題是比較常見(jiàn)的,最近我們公司需要將springboot 1.x升級(jí)到2.x,在升級(jí)之后遇到了挺多的問(wèn)題,例如某些類(lèi)過(guò)時(shí)了或者某些類(lèi)找不到等,還有就是今天要說(shuō)得session不一致的情況(eg:請(qǐng)求不同接口,sessionID都不一致,即session不會(huì)共享)。

場(chǎng)景   

今天前端童鞋跟我說(shuō),本地環(huán)境調(diào)用校驗(yàn)驗(yàn)證碼接口一直報(bào)“未獲取到用戶(hù)信息,請(qǐng)重新登錄”,我直接看了下這個(gè)接口,他是從session中獲取的用戶(hù)信息,如果用戶(hù)不存在則會(huì)拋這種提示語(yǔ)。

    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;
        }

  

因?yàn)槲覀兊卿浐托r?yàn)驗(yàn)證碼是兩個(gè)接口,所以用戶(hù)信息是從登錄放進(jìn)去的,然后在驗(yàn)證碼接口中獲取用戶(hù)信息做后面的進(jìn)一步操作?! ?/p>

看到這個(gè)之后,我看了下springboot的配置,都有配置session 共享的配置,而且我的session是放在redis里面的,有點(diǎn)郁悶,然后我就登錄到測(cè)試環(huán)境登錄一下試試看,咦~~居然可以,最后才反應(yīng)過(guò)來(lái)是跨域的問(wèn)題,然后我又去看了下代碼,是有配置跨域的問(wèn)題,真奇怪!  

經(jīng)過(guò)一天的百度與排查,我回滾到springboot 1.x居然沒(méi)有這個(gè)問(wèn)題,才定位到是升級(jí)到springboot 2.x導(dǎo)致的原因,好了,已經(jīng)抓住兇手了,這下子好對(duì)癥下藥了,去網(wǎng)上看了 springboot升級(jí)到2.xspring session 相關(guān)的問(wèn)題?! ?/p>

終于發(fā)現(xiàn)了新大陸,spring-session 2.x 中 Cookie里面居然引入了SameSite 這個(gè)叼毛,他默認(rèn)值是 Lax,好了咱們來(lái)看看這個(gè)是什么東西?  

SameSite Cookie 是用來(lái)防止CSRF攻擊,它有兩個(gè)值:Strict、Lax

  • SameSite = Strict:

意為嚴(yán)格模式,表明這個(gè)cookie在任何情況下都不可能作為第三方cookie;

  • SameSite = Lax:

意為寬松模式,在get請(qǐng)求是可以作為第三方cookie,但是不能攜帶cookie進(jìn)行跨域post訪問(wèn)(這就很蛋疼了,我們那個(gè)校驗(yàn)接口就是POST請(qǐng)求)

總結(jié)

前端請(qǐng)求到后臺(tái),每次session都不一樣,每次都是新的會(huì)話,導(dǎo)致獲取不到用戶(hù)信息

解決方案

將SameSite設(shè)置為空

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();
        // 取消僅限同一站點(diǎn)設(shè)置
        cookieSerializer.setSameSite(null);
        return cookieSerializer;
    }
}

pom.xml依賴(lài)

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java工具包之Lombok使用

    Java工具包之Lombok使用

    這篇文章主要介紹了Java工具包之Lombok使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java?SWT中常見(jiàn)彈出框?qū)嵗偨Y(jié)

    Java?SWT中常見(jiàn)彈出框?qū)嵗偨Y(jié)

    剛開(kāi)始寫(xiě)Java工具的小伙伴可能不知道怎么寫(xiě)消息對(duì)話框,在這里總結(jié)一些常用的幾種消息彈出框,下面這篇文章主要給大家介紹了關(guān)于Java?SWT中常見(jiàn)彈出框的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    這篇文章主要介紹了Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法,涉及java針對(duì)鼠標(biāo)事件及圖片操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Java集合之LinkedList源碼解析

    Java集合之LinkedList源碼解析

    這篇文章主要介紹了Java集合之LinkedList源碼解析,LinkedList和ArrayList數(shù)據(jù)結(jié)構(gòu)是完全不一樣的,ArrayList 底層是數(shù)組的結(jié)構(gòu),而 LinkedList 的底層則是鏈表的結(jié)構(gòu), 它可以進(jìn)行高效的插入和移除的操作,它基于的是一個(gè)雙向鏈表的結(jié)構(gòu),需要的朋友可以參考下
    2023-12-12
  • 微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件

    微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件

    這篇文章主要介紹了微服務(wù)之間如何通過(guò)feign調(diào)用接口上傳文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Mybatis Update操作返回值問(wèn)題

    Mybatis Update操作返回值問(wèn)題

    在獲取update操作的返回值時(shí)遇到了一個(gè)問(wèn)題,似乎 Mybatis 進(jìn)行 update 操作得到的 int 返回值并不是影響的行數(shù),下面通過(guò)本文給大家分享Mybatis Update操作返回值問(wèn)題,需要的朋友參考下吧
    2017-09-09
  • Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例

    Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例

    雪花算法是 Twitter 開(kāi)源的一種分布式ID生成算法,其目的是生成全局唯一的 ID,本文主要介紹了Java使用雪花算法生成唯一ID的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • SpringMVC Tomcat控制臺(tái)亂碼問(wèn)題解決方案

    SpringMVC Tomcat控制臺(tái)亂碼問(wèn)題解決方案

    這篇文章主要介紹了SpringMVC Tomcat控制臺(tái)亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解

    Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解

    這篇文章主要介紹了Java 處理超大數(shù)類(lèi)型之BigInteger案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)順序表的操作詳解

    Java實(shí)現(xiàn)順序表的操作詳解

    順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。本文主要介紹了順序表的實(shí)現(xiàn)與常用操作,需要的可以參考一下
    2022-09-09

最新評(píng)論