现在项目越来越流行前后端分离,但最近在前后端分离的项目中遇到一个问题,获取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');
----------来源:https://www.cnblogs.com/alone-hy/p/11949754.html