關於chrome瀏覽器無法set-cookie問題


問題描述:當瀏覽器訪問后台的時候無法攜帶cookie,導致后台無法收到cookie值,從而無法進行權限鑒定等操作。

問題發現:

  • 業務邏輯:后台在用戶登錄成功之后會生成UUID為Session的key;並添加Cookie:"token":UUID;當用戶再次訪問的時候需要獲取token再獲取session中的信息。但是當再次訪問的時候獲取不到cookie中的token。

判斷出問題地方:

  1. 在登錄后的瀏覽器的響應體中看到set-cookie:token:xxx 所以后端沒為題;
  2. 在第二次訪問的時候后端無法獲取cookie,請求體中也沒有發現token,所以問題在第一次請求返回和第二次請求之間;
  3. 使用其他瀏覽器嘗試——可以,問題就是chrome了。(注意:使用axios時默認不攜帶cookie,需要設置axios.defaults.withCredentials=true使其攜帶cookie;比如我的項目中是在vue的登錄組件處先設置,在使用axios發送請求。)

解決:經查閱資料發現是由於chrom瀏覽器開啟了SameSite用於防止CSRF(跨域請求偽造),當關閉該選項之后即可。設置方式:

  • 地址欄輸入:chrome://flags/

  • 搜索欄輸入SameSite,得到如下:

  • 改為disable,並重啟瀏覽器即可

跨域問題

其實造成這個原因還是因為跨域的原因。在本項目中前端使用vue,訪問后台的時候就會出現跨域問題。
因為這里后台使用的是Springboot,所以使用了CORS來解決跨域問題。
Spring官方提供三種方式,詳見官網解釋

  1. 在方法或Controller上使用注解:@CrossOrigin
  2. 創建配置類實現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過濾器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM