php前后端分離項目跨域


現在項目越來越流行前后端分離,但最近在前后端分離的項目中遇到一個問題,獲取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');

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM