ホームページ  >  記事  >  ウェブフロントエンド  >  AjaxクロスドメインアクセスにおけるCookie消失の解決策の説明

AjaxクロスドメインアクセスにおけるCookie消失の解決策の説明

jacklove
jackloveオリジナル
2018-06-08 17:58:402053ブラウズ

Ajax のクロスドメイン アクセスは、jsonp メソッドまたは Access-Control-Allow-Origin の設定を使用して実現できます。クロスドメイン アクセスを実現するための Access-Control-Allow-Origin の設定については、以前に書いた「ajax」の記事を参照してください。 Access-Control-Allow-Originの設定によりクロスドメインアクセスが実現します》

1.ajaxクロスドメインアクセス、クッキーロス

まずクライアントドメイン名として2つのテストドメイン名
a.fdipzone.comを作成します
サーバーとしてのb.fdipzone.com ドメイン名

テストコード

setcookie.phpはサーバーCookieの設定に使用されます

<?phpsetcookie(&#39;data&#39;, time(), time()+3600);?>

server.phpはリクエストに使用されますclient

<?php$name = isset($_POST[&#39;name&#39;])? $_POST[&#39;name&#39;] : &#39;&#39;;$ret = array(    &#39;success&#39; => true,    &#39;name&#39; => $name,    &#39;cookie&#39; => isset($_COOKIE[&#39;data&#39;])? $_COOKIE[&#39;data&#39;] : &#39;&#39;);// 指定允许其他域名访问header(&#39;Access-Control-Allow-Origin:http://a.fdipzone.com&#39;);// 响应类型header(&#39;Access-Control-Allow-Methods:POST&#39;);  

// 响应头设置header(&#39;Access-Control-Allow-Headers:x-requested-with,content-type&#39;);

header(&#39;content-type:application/json&#39;);echo json_encode($ret);?>

test.html クライアントエンド ページ

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>

 <body>
    <script type="text/javascript">
    $(function(){

        $.ajax({
            url: &#39;http://b.fdipzone.com/server.php&#39;, // 跨域
            dataType: &#39;json&#39;,
            type: &#39;post&#39;,
            data: {&#39;name&#39;:&#39;fdipzone&#39;},
            success:function(ret){
                if(ret[&#39;success&#39;]==true){
                    alert(&#39;cookie:&#39; + ret[&#39;cookie&#39;]);
                }
            }
        });

    })    </script>

 </body></html>

をリクエストするには、まず http://b.fdipzone.com/setcookie.php を実行してサーバーサイド Cookie を作成します。
次に http://a.fdipzone.com/test.html を実行します

Output

{"success":true,"name":"fdipzone","cookie":""}

Cookieの取得に失敗しました。

2. 解決策

クライアント リクエストを行うときに
withCredentials 属性を true に設定して、特定のリクエストが認証情報を送信するように指定できるようにします。サーバーが認証情報付きのリクエストを受信すると、次の HTTP ヘッダーで応答します。

サーバー

ヘッダーを設定します

header("Access-Control-Allow-Credentials:true");

検証情報を含むリクエストを許可します


test.html次のように変更します

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>
 <head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
  <title> ajax 跨域访问cookie丢失的解决方法 </title>
 </head>

 <body>
    <script type="text/javascript">
    $(function(){

        $.ajax({
            url: &#39;http://b.fdipzone.com/server.php&#39;, // 跨域
            xhrFields:{withCredentials: true}, // 发送凭据
            dataType: &#39;json&#39;,
            type: &#39;post&#39;,
            data: {&#39;name&#39;:&#39;fdipzone&#39;},
            success:function(ret){
                if(ret[&#39;success&#39;]==true){
                    alert(&#39;cookie:&#39; + ret[&#39;cookie&#39;]);
                }
            }
        });

    })    </script>

 </body></html>

server.php次のように変更します

<?php$name = isset($_POST[&#39;name&#39;])? $_POST[&#39;name&#39;] : &#39;&#39;;$ret = array(    &#39;success&#39; => true,    &#39;name&#39; => $name,    &#39;cookie&#39; => isset($_COOKIE[&#39;data&#39;])? $_COOKIE[&#39;data&#39;] : &#39;&#39;);// 指定允许其他域名访问header(&#39;Access-Control-Allow-Origin:http://a.fdipzone.com&#39;);// 响应类型header(&#39;Access-Control-Allow-Methods:POST&#39;);  

// 响应头设置header(&#39;Access-Control-Allow-Headers:x-requested-with,content-type&#39;);// 是否允许请求带有验证信息header(&#39;Access-Control-Allow-Credentials:true&#39;);

header(&#39;content-type:application/json&#39;);echo json_encode($ret);?>
リクエスト

{"success":true,"name":"fdipzone","cookie":"1484558863"}

Cookie の取得に成功しました


3. 注意事項

1. クライアントが withCredentials 属性を true に設定しているが、サーバーが Access-Control-Allow-Credentials:true を設定していない場合、エラーが発生します。リクエスト中に返されました。

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. Credentials flag is &#39;true&#39;, but the &#39;Access-Control-Allow-Credentials&#39; header is &#39;&#39;. It must be &#39;true&#39; to allow credentials. Origin &#39;http://a.fdipzone.com&#39; is therefore not allowed access.

2. サーバーヘッダーで Access-Control-Allow-Credentials:true を設定した後、Access-Control-Allow-Origin を * に設定することはできません。ドメイン名に設定する必要があります。そうしないと、エラーが返されます。

XMLHttpRequest cannot load http://b.fdipzone.com/server.php. A wildcard &#39;*&#39; cannot be used in the &#39;Access-Control-Allow-Origin&#39; header when the credentials flag is true. Origin &#39;http://a.fdipzone.com&#39; is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

この記事では、Ajax クロスドメイン アクセスにおける Cookie 損失の解決策について説明します。関連コンテンツの詳細については、PHP 中国語 Web サイトを参照してください。

関連する推奨事項:

mysqlのkey_lenの計算方法の説明explain


curlを使用してphpを介してIPとソースアクセスをシミュレートする方法


mysqlを介してNULLデータメソッドを変換する

以上がAjaxクロスドメインアクセスにおけるCookie消失の解決策の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。