乐趣区

关于ajax: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=””>

password: <input type=”password” name=”pwd” id=”pwd” value=””>

<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

<?php
session_start();
$name = $_SESSION[‘name’];
var_dump($name);
?>

测试完结,能够正确的打印 session 中 name 的值。

关键词:前端培训

退出移动版