博客 / 詳情

返回

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的值。

關鍵詞:前端培訓

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.