現在項目越來越流行前后端分離,但最近在前后端分離的項目中遇到一個問題,獲取session里面存入的用戶信息總是為null,這是因為實現了前后端分離后跨域導致了會話不一致,由於之前一直沒有做過前后端分離項目,導致走了不少彎路,而且還采用了多種及其不優雅的方法
1.(在第一次請求的時候把服務器返回的session id保存起來,后續請求的時候把該session id作為參數傳遞給后端,
后端在每次請求的時候先判斷客戶端傳遞過來的參數中session id是否為空,不為空則設置當前session id為傳遞過來的session id,然后session_start,為空則直接session_start。)
2.后端使用openssl對稱加密來把用戶信息封裝為一個token來存儲在前端,在每次請求時來校驗token來確認用戶是否登錄,但這樣不僅麻煩還不怎么安全。
上面那樣做的原因是,ajax請求無法獲取header、cookie等信息。但是后來發現有更方便的解決方法。jquery的ajax請求中可以設置下面兩個參數,瀏覽器會自動幫你保存、發送這些header信息。
xhrFields: { withCredentials: true }, crossDomain: true,
//例 $.ajax({ url: "url", //請求的url地址 dataType: "json", //返回格式類型為json 可選參數(jsonp,html,xml,text,script,json xhrFields: { withCredentials: true },//需要設置的參數 crossDomain: true,//需要設置的參數 async: true, //請求是否異步,默認為true:異步,這也是ajax重要特性 可不寫該參數 type: "post", //請求方式類型(put,delete,post,get) data: { }, beforeSend: function() { //請求前的處理操作 }, success: function(data,textStatus) { //此處data為返回值 //請求成功時處理操作 }, complete: function() { //請求完成的處理操作 }, error: function() { //請求出錯處理操作 } });
PHP端則需要設置header頭
$origin = isset($_SERVER['HTTP_ORIGIN'])? $_SERVER['HTTP_ORIGIN'] : ''; // 允許所有跨域請求,測試用,生產環境請使用具體域名代替 header('Access-Control-Allow-Origin:'.$origin); header('Access-Control-Allow-Credentials:true');