ajax 跨域 session 丢失问题
ajax 跨域时session丢失了!!!
解决方法:
首先我 Google 了一下这个问题的原因,我找到了这个:
(1)Access-Control-Allow-Origin该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。(2)Access-Control-Allow-Credentials该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求 之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能 设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。(3)Access-Control-Expose-Headers该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段: Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿 到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定, getResponseHeader('FooBar')可以返回FooBar字段的值。 3.2 withCredentials 属性上面说到,CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器 同意,指定Access-Control-Allow-Credentials字段。Access-Control-Allow-Credentials: true
我写了一个 demo 来试验这个方法:
-
前端代码
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script></head><body>name: <input type="text" name="inputTest" value=""><br>password: <input type="password" name="pwd" id="pwd" value=""><br><button id="but">提交</button></body><script>$("button").click(function () {var names=$("input[name='inputTest']").val();var pwds=$("input[name='pwd']").val();var url = 'http://example.com/demo/test.php';var postData = {'name':names, 'pwd':pwds};$.ajax({type: "POST",url: url,data:postData,dataType: 'jsonp',jsonp:'callback',xhrFields: {withCredentials: true},crossDomain: true,success:function(res){console.log(res.name)},error:function(){}})});</script></html>
后端 php 代码:(test.php)
<?php//简单测试上述方法header("Access-Control-Allow-Creadentials: true");header("Access-Control-Allow-Origin: http://shili.com");$name = $_REQUEST['name'];$pwd = $_REQUEST['pwd'];session_start();$_SESSION['name'] = $name;$data = ['name' => $_SESSION['name'], 'pwd' => $pwd];$res = json_encode($data);$callback = $_GET['callback'];echo $callback . "($res)";?>
这里需要注意的是:
需要注意的是,如果要发送 Cookie,Access-Control-Allow-Origin 就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie 依然遵循同源政策,前端培训只有用服务器域名设置的 Cookie 才会上传,其他域名的 Cookie 并不会上传,且(跨源)原网页代码中的 document.cookie 也无法读取服务器域名下的 Cookie。
ceshi.php
<?phpsession_start();$name = $_SESSION['name'];var_dump($name);?>
测试结束,可以正确的打印session中name的值。

浙公网安备 33010602011771号