問題:前端vue+axios,后台springboot2.3+spring-session,為了解決跨域問題,前端已經設置了
axios.defaults.withCredentials = true;
后台也加了注解
@CrossOrigin(origins = "*", maxAge = 3600,allowCredentials="true")
但是登錄后,前端一直攜帶不了cookies。
原因:
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設置為空
package com.pacmp.config; 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; /** * @Author * @Date 2020/7/14 14:12 * @Version 版本號 * @Description 解決SameSite=Lax導致前端無法攜帶Cookie的坑 */ @Configuration public class SpringSessionConfig { public SpringSessionConfig() { } @Bean public CookieSerializer httpSessionIdResolver() { DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); // 取消僅限同一站點設置 cookieSerializer.setSameSite(null); return cookieSerializer; } }