問題描述:當瀏覽器訪問后台的時候無法攜帶cookie,導致后台無法收到cookie值,從而無法進行權限鑒定等操作。
問題發現:
- 業務邏輯:后台在用戶登錄成功之后會生成UUID為Session的key;並添加Cookie:"token":UUID;當用戶再次訪問的時候需要獲取token再獲取session中的信息。但是當再次訪問的時候獲取不到cookie中的token。
判斷出問題地方:
- 在登錄后的瀏覽器的響應體中看到set-cookie:token:xxx 所以后端沒為題;
- 在第二次訪問的時候后端無法獲取cookie,請求體中也沒有發現token,所以問題在第一次請求返回和第二次請求之間;
- 使用其他瀏覽器嘗試——可以,問題就是chrome了。(
注意
:使用axios時默認不攜帶cookie,需要設置axios.defaults.withCredentials=true使其攜帶cookie;比如我的項目中是在vue的登錄組件處先設置,在使用axios發送請求。)
解決:經查閱資料發現是由於chrom瀏覽器開啟了SameSite用於防止CSRF(跨域請求偽造),當關閉該選項之后即可。設置方式:
-
地址欄輸入:chrome://flags/
-
搜索欄輸入SameSite,得到如下:
- 改為disable,並重啟瀏覽器即可
跨域問題
其實造成這個原因還是因為跨域的原因。在本項目中前端使用vue,訪問后台的時候就會出現跨域問題。
因為這里后台使用的是Springboot,所以使用了CORS來解決跨域問題。
Spring官方提供三種方式,詳見官網解釋:
- 在方法或Controller上使用注解:@CrossOrigin
- 創建配置類實現WebMvcConfigurer接口並重寫addCorsMappings方法
@Configuration
@MapperScan("com.zjj.spike_system.mapper") //掃描包
public class WebConfig implements WebMvcConfigurer {
/*
* 配置跨域:也可以在Controller上使用 @CrossOrigin注解
* */
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOriginPatterns("*").allowCredentials(true).allowedMethods("POST","GET","PUT","DELETE").maxAge(3600);
}
3.使用CORSFilter過濾器