Spring Cloud Gateway設(shè)置session超時時間

在使用Spring Cloud框架的時候,Http的請求首先會到達(dá)Spring Cloud Gateway服務(wù),并與之建立session對象,但是在默認(rèn)情況下,請求結(jié)果之后,session會立刻過期。有些業(yè)務(wù)場景可能會在session中存儲一些數(shù)據(jù),比如登陸狀態(tài),如果登陸之后,長時間沒有訪問,再次訪問的時候,讓用戶重新登陸等,都需要控制session的空閑時間。在Spring Cloud Gateway中,默認(rèn)管理session的類是InMemoryWebSessionStore,它里面的內(nèi)部類InMemoryWebSession實(shí)現(xiàn)了WebSession接口。在這個接口,有兩個方法,有來設(shè)置和獲取session的最大空閑時間:

        @Override
        public void setMaxIdleTime(Duration maxIdleTime) {
            this.maxIdleTime = maxIdleTime;
        }

        @Override
        public Duration getMaxIdleTime() {
            return this.maxIdleTime;
        }

所以,要想修改它的空閑最大時間,就需要調(diào)用setMaxIdleTime方法進(jìn)行設(shè)置。
另外,session過期檢測的方法如下:

       @Override
        public boolean isExpired() {
            return isExpired(clock.instant());
        }

        private boolean isExpired(Instant now) {
            if (this.state.get().equals(State.EXPIRED)) {
                return true;
            }
            if (checkExpired(now)) {
                this.state.set(State.EXPIRED);
                return true;
            }
            return false;
        }

        private boolean checkExpired(Instant currentTime) {
            return isStarted() && !this.maxIdleTime.isNegative() &&
            currentTime.minus(this.maxIdleTime).isAfter(this.lastAccessTime);
        }

在這個代碼里面有一個isStarted方法,在里面會判斷,如果設(shè)置了session是start狀態(tài),或者session里面有屬性值時,isStarted才返回true。

遺憾的是,session的最大空閑值默認(rèn)是不能在application.yml中直接配置的,如果想修改最大空閑,可以添加過濾器實(shí)現(xiàn),如下所示:

import java.time.Duration;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.server.WebSession;

@Service
public class SessionGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            WebSession session = exchange.getSession().block();
            session.setMaxIdleTime(Duration.ofDays(7));
            return chain.filter(exchange);
        };
    }

}

然后在application.yml中添加下面的配置,讓過濾器生效:

spring:
   cloud:
      gateway:
        discovery:
          locator:
            enabled: true
        default-filters:
        - Session

這樣就成功修改了session的最大空閑時間了。一般session中存儲了一些數(shù)據(jù)時,才需要設(shè)置最大空閑參數(shù)。

公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容