網站首頁 編程語言 正文
問題
vue項目,本地開發本來好好的,瀏覽器升級后,突然就不行了。連頁面都沒渲染到app
上,白屏了,如下:
雖然本地開發無法加載頁面了,但是npm run build
后打包發布的代碼,瀏覽器可以正常訪問,完全沒問題。
項目登錄認證頁面,是公司另外部門封裝的一個統一認證頁面,短期是無法通過代碼層面解決問題的,所以看看瀏覽器更新后,發生了什么,看看能不能解決了。
尋因
在開發者工具的Network
里,找到登錄認證的幾個請求接口,發現有2個關鍵的接口,都返回了如下信息:
Failed to load response data: No resource with given identifier found
接口無返回認證信息,導致渲染頁面的流程也走不下去了,造成了頁面渲染失敗,白屏。
再看看控制臺打印,發現Console
里面有了新的告警,如下:
由于 Cookie “JSESSIONID”缺少“SameSite”屬性,且該屬性的默認值為“SameSite=Lax”,已將“SameSite”的策略設為“Lax”。
由于 Cookie “”缺少“SameSite”屬性,且該屬性的默認值為“SameSite=Lax”,已將“SameSite”的策略設為“Lax”。
SameSite
是 Chrome 51 版本后添加的一個屬性,用來防止 CSRF 攻擊和用戶追蹤(相關資料)。
SameSite
有3個屬性:
-
Strict 最為嚴格,完全禁止第三方Cookie,跨站點時,任何情況下都不會發送Cookie。只有當前網頁URL與請求目標URL完全一致才會帶上Cookie。
-
Lax 規則稍稍放寬,大多數情況也是不發送第三方Cookie,但是導航到目標網址的 Get 請求除外。
-
None 網站可以選擇顯式關閉SameSite屬性,將其設為None。不過,前提是必須同時設置Secure屬性(Cookie 只能通過 HTTPS 協議發送),否則無效。
通過以上信息,知道,更新后的瀏覽器,安全要求,接口報文里面的set-cookie
要設置SameSite
屬性,默認將沒有設置SameSite
的請求設置為SameSite=Lax
。
項目認證接口,在本地開發的情況下,是跨站點&跨域 Get 請求,接口沒有設置SameSite
屬性,在瀏覽器默認設置SameSite=Lax
的情況下,導致請求沒帶上Cookie
,認證失敗,接口不會返回數據,導致了接口Failed to load response data
的問題。
發布生產時,認證接口是同源&同站點 Get 請求,就沒問題了。
解決方案
1、Chrome 51版本后91版本前
運行本地項目調試時,某些接口需要使用cookie來校驗,會涉及到cookie跨域丟失問題。對于前端來說,調試項目時想要實現瀏覽器跨域共享cookie,可以設置瀏覽器的實驗屬性,關閉瀏覽器的安全設置,操作如下:
- 在Chrome地址欄輸入
chrome://flags
- 把
SameSite by default cookies
、Cookies without SameSite must be secure
設置成Disabled
- 重啟瀏覽器生效
2、Chrome 91版本后
Chrome 91 版本后,Chrome實驗屬性 SameSite by default cookies
、Cookies without SameSite must be secure
的設置消失了。臨時解決辦法就是安裝舊版本的Chrome,因為本人是Mac下開發,只分享下Mac下安裝舊版本瀏覽器的辦法。
Mac下谷歌瀏覽器穩定版、dev版的舊版不能和新版共存,如果更新了最新瀏覽器,又不想降版本的,可以下載谷歌瀏覽器canary
版(可以和穩定版、dev版共存),各版本下載地址,選擇91前的版本,然后照著 [1]的操作設置下就ok了。
3、接口設置SameSite=none
服務端將 response 的 header 設置Set-Cookie:SameSite=None
,允許跨站請求發送 Cookie。
Set-cookie: key=value; SameSite=None; Secure
- 注意1:接口必須是
https
- 注意2:需要
UA
檢測,部分瀏覽器不能加SameSite=none
IOS 12的 Safari 以及老版本的一些 Chrome 會把 SameSite=none
識別成 SameSite=Strict
,所以服務端必須在下發 Set-Cookie
響應頭時進行 User-Agent 檢測,對這些瀏覽器不下發SameSite=none
屬性
4、用火狐
不知道Windows下什么情況,反正Mac很幸運的,在升級 96 版本后也不行了。
總結
當接口依賴Cookie
時,前端不發送Cookie
,會造成接口不返回數據的問題。也就是文章開頭的Failed to load response data: No resource with given identifier found
問題。
瀏覽器對前端安全和用戶隱私越來越重視了,現在是瀏覽器默認策略倒逼接口安全升級了。
一些通用服務接口,最好是服務端設置解決了。不然第三方開發過程中,遇到本文所述問題,真的很無語的,說是前端的問題也行,說不是前端的問題,貌似也沒錯。隨著瀏覽器安全策略的不斷更新,服務端接口的安全策略也要隨著更新了,特別是一些不需要收集用戶信息、不搞廣告的項目,生產環境嚴格執行SameSite
的安全策略其實也沒啥問題的,反而更好。供第三方開發時,說明下注意的設置就好了。
參考資料
原文鏈接:https://blog.csdn.net/liyoro/article/details/122616506
相關推薦
- 2023-04-20 使用replaceAll()方法實現數字千分位逗號分隔
- 2022-12-12 C語言scanf語句吃掉回車或者空格問題及解決_C 語言
- 2022-09-04 Docker-Compose?容器集群的快速編排方法_docker
- 2022-11-05 Kotlin數據容器深入講解_Android
- 2022-04-03 django8.5?項目部署Nginx的操作步驟_nginx
- 2022-10-07 C#如何實現調取釘釘考勤接口的功能_C#教程
- 2022-05-04 R語言數據類型與相應運算的實現_R語言
- 2022-07-26 對Python中GIL(全局解釋器鎖)的一點理解淺析_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支