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');

猜你喜欢

转载自www.cnblogs.com/alone-hy/p/11949754.html
今日推荐