解決跨域訪問導致session id不一致的問題

2022-05-06 23:03:08 字數 1577 閱讀 1001

一、問題

前後端分離專案,使用了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】:

//

允許跨域

); // 動態設定允許**

header("access-control-allow-methods: *");

header('access-control-allow-credentials: true');

前端請求設定withcredentials屬性,比如【vue.js】:

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是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。同源策略是處於對使用者安全的考慮,如果非同源就會受到以下限制 但是事實是經常...