在前後端分離的開發模式中,跨域請求已成為常見場景。然而由於瀏覽器的同源策略限制,Session在跨域訪問時無法被共享,這會導致用戶登錄狀態無法在不同域名之間保持。為了實現Session跨域共享,我們可以採用Cookie或Token等方式進行處理。
Cookie可以在一定條件下實現跨域傳遞,因此是一種較為常見的Session共享方案。以下是實現步驟:
第一步,在服務端創建Session:
session_start();
$_SESSION['user'] = 'example';
第二步,將Session ID寫入Cookie,並設置Cookie作用域:
setcookie(session_name(), session_id(), time() + 60*60*24*30, '/', 'www.example.com', false, true);
其中, www.example.com應根據實際域名修改。
第三步,在前端跨域請求時攜帶Cookie:
fetch('http://www.example.com/api', {
credentials: 'include',
});
這裡的credentials: 'include'用於確保瀏覽器在請求中發送Cookie信息。
第四步,服務端接收請求並解析Cookie中的Session:
session_id($_COOKIE[session_name()]);
session_start();
if(isset($_SESSION['user'])){
// session 跨域共享成功
}else{
// session 跨域共享失敗
}
通過上述配置,即可在跨域環境下共享Session信息。
另一種更靈活的方案是使用Token機制來實現跨域Session共享。這種方法不依賴Cookie,因此更適合API接口或移動端場景。
實現步驟如下:
第一步,用戶登錄時在服務端生成一個Token:
$token = bin2hex(random_bytes(16));
// 將token存入數據庫並與用戶綁定
// 返回token給客戶端
第二步,前端將Token保存到localStorage或sessionStorage中。
第三步,跨域請求時將Token添加到請求頭或參數中發送至服務端:
fetch('http://api.example.com/userinfo', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token')
}
});
第四步,服務端通過解析Token驗證用戶身份,並根據驗證結果恢復Session狀態。
在使用Token方案時,需要注意安全性問題。 Token應設置有效期,並可通過刷新機制定期更新;服務端還應定期清理過期Token,以防止安全風險。
本文介紹了兩種常見的PHP Session跨域共享方案:通過Cookie共享Session和通過Token機制實現Session驗證。前者實現簡單,適合同主域下的子域共享;後者更靈活、安全性更高,適用於復雜的分佈式或多端系統。開發者可根據項目架構與安全需求選擇合適的實現方式。