目前系統(tǒng)使用的網(wǎng)關(guān)是Spring Cloud Gateway,并且加入了Spring Security來保護(hù)系統(tǒng)家浇。 用戶認(rèn)證是基于jwt來認(rèn)證本砰,因此沒用使用session。
但是經(jīng)過測試發(fā)現(xiàn)钢悲,當(dāng)請求的cookie中有session時(shí)点额,服務(wù)端響應(yīng)的set-cookie 中也有session字段,并且session是空值莺琳,因此我們需要禁用session还棱,避免返回空值。
1.如果是基于springmvc的服務(wù)惭等,那么禁用session 可以在配置類WebSecurityConfigurerAdapter的子類中增加session相關(guān)的配置
@Override
protected void configure(HttpSecurity http) throws Exception {
//設(shè)置session為無狀態(tài)模式
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.antMatchers("/**").permitAll();
}
2.但是Spring Cloud Gateway 是基于spring webflux 沒有上面的WebSecurityConfigurerAdapter配置類珍手,經(jīng)過翻看代碼發(fā)現(xiàn),在默認(rèn)的ServerWebExchange的實(shí)現(xiàn)類DefaultServerWebExchange中有關(guān)于session的配置
DefaultServerWebExchange(ServerHttpRequest request, ServerHttpResponse response,
WebSessionManager sessionManager, ServerCodecConfigurer codecConfigurer,
LocaleContextResolver localeContextResolver, @Nullable ApplicationContext applicationContext) {
Assert.notNull(request, "'request' is required");
Assert.notNull(response, "'response' is required");
Assert.notNull(sessionManager, "'sessionManager' is required");
Assert.notNull(codecConfigurer, "'codecConfigurer' is required");
Assert.notNull(localeContextResolver, "'localeContextResolver' is required");
// Initialize before first call to getLogPrefix()
this.attributes.put(ServerWebExchange.LOG_ID_ATTRIBUTE, request.getId());
this.request = request;
this.response = response;
//session 管理 默認(rèn)的為DefaultWebSessionManager 使用的是InMemoryWebSessionStore
this.sessionMono = sessionManager.getSession(this).cache();
this.localeContextResolver = localeContextResolver;
this.formDataMono = initFormData(request, codecConfigurer, getLogPrefix());
this.multipartDataMono = initMultipartData(request, codecConfigurer, getLogPrefix());
this.applicationContext = applicationContext;
}
基于此可以在系統(tǒng)中 注入一個(gè)WebSessionManager咕缎,此WebSessionManager初始化為DefaultWebSessionManager珠十,并且調(diào)用setSessionIdResolver方法。
設(shè)置的SessionIdResolver為CookieWebSessionIdResolver的子類凭豪,置空session過期的方法expireSession
此時(shí)相當(dāng)于session過期之后不做任何處理焙蹭,因此也不會(huì)有set-cookie的響應(yīng)
,如下
@Bean
public WebSessionManager webSessionManager() {
DefaultWebSessionManager defaultWebSessionManager = new DefaultWebSessionManager();
defaultWebSessionManager.setSessionIdResolver(new CookieWebSessionIdResolver(){
@Override
public void expireSession(ServerWebExchange exchange) {
//session 過期不做任何處理
}
});
return defaultWebSessionManager;
}
此時(shí)DefaultServerWebExchange中的sessionManager 就被替換成我們自定義的返回空的session的對象嫂伞。此時(shí)不對session做任何處理孔厉。最終返回出去的set-cookie 中就沒有session 相關(guān)的內(nèi)容。