一、問題
前後端分離專案,使用了session儲存使用者的資訊,使用者登入成功後,用同乙個token去獲取使用者資訊時,出現了提示該使用者未登入的錯誤。
二、原因
前端使用ajax請求,涉及到跨域問題,導致了同乙個使用者的請求的session_id不一致,所以出現上述問題,日誌捕獲到的session_id資訊如下:
服務端設定的允許跨域訪問**如下【php】:
header('access-control-allow-origin: *'); //以上設定其實是存在衝突的。允許所有**訪問
header("access-control-allow-methods: *"); //
允許所有的請求方式
header('access-control-allow-headers: *'); //
允許攜帶任意的請求頭
header('access-control-allow-credentials: true'); //
允許客戶端攜帶驗證資訊,例如 cookie 之類的
cors請求預設不傳送cookie和http認證資訊。如果要把cookie發到伺服器,一方面要伺服器同意,指定access-control-allow-credentials
字段,另一方面,開發者必須在ajax請求中開啟withcredentials
屬性,需要注意的是,如果要傳送cookie,access-control-allow-origin
就不能設為星號,必須指定明確的、與請求網頁一致的網域名稱
這裡可以參考阮一峰老師的文章:跨域資源共享 cors 詳解【尤其需要注意的是簡單請求和複雜請求的理解】
三、解決
服務端設定的允許跨域訪問**如下【php、tp3.2】:
//前端請求設定withcredentials屬性,比如【vue.js】:允許跨域
); // 動態設定允許**
header("access-control-allow-methods: *");
header('access-control-allow-credentials: true');
axios.defaults.withcredentials = true;問題解決,日誌捕獲到的session_id資訊如下:
四、參考鏈結
1、2、
3、4、
解決跨域訪問session丟失問題
問題 前後端兩個專案,前段訪問後端api,前段用angularjs 後端用的express,設定res.header access control allow origin 可以跨域訪問,正常查詢資料庫返回。但是遇到有許可權檢查的api就不行,一直提示需要登陸。搜了下資料,是因為跨域問題,每次get...
URL資源跨域訪問 跨域使用session資訊
silverlight 出於對安全性的考慮預設情況下對url的訪問進行了嚴格的限制,只允許訪問同一子域下的url資源。下表列出了silverlight 2.0 中 url 訪問規則 webclient物件 media images asx xaml 檔案 font 檔案 流 允許的協議 跨協議訪問 ...
跨域訪問及Nginx解決跨域訪問
同源策略 sameorigin policy 是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。同源策略是處於對使用者安全的考慮,如果非同源就會受到以下限制 但是事實是經常...