Ajax 도메인 간 액세스 시 쿠키 손실에 대한 솔루션에 대한 설명

jacklove
풀어 주다: 2018-06-08 17:58:40
원래의
2051명이 탐색했습니다.

Ajax 교차 도메인 액세스는 jsonp 방법을 사용하거나 Access-Control-Allow-Origin 설정을 사용하여 달성할 수 있습니다. 교차 도메인 액세스를 달성하기 위한 Access-Control-Allow-Origin 설정에 대해서는 "ajax" 전에 작성한 기사를 참조할 수 있습니다. Access-Control-Allow 설정 - Origin은 교차 도메인 액세스를 실현합니다》

1.ajax 교차 도메인 액세스, 쿠키 손실

먼저 두 개의 테스트 도메인 이름
a.fdipzone.com을 클라이언트 도메인 이름으로 생성합니다
b.fdipzone.com 서버로 도메인 이름

테스트 코드

setcookie.php는 서버 쿠키를 설정하는 데 사용됩니다.

<?phpsetcookie(&#39;data&#39;, time(), time()+3600);?>
로그인 후 복사

server.php는 다음에서 요청하는 데 사용됩니다. the 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 client end

<!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를 실행하여 서버측 쿠키를 생성하세요.
그런 다음 http://a.fdipzone.com/test.html

Output

{"success":true,"name":"fdipzone","cookie":""}
로그인 후 복사

쿠키를 가져오지 못했습니다.

2. 솔루션

클라이언트
특정 요청이 자격 증명을 보내도록 지정할 수 있도록 요청할 때 withCredentials 속성을 true로 설정하세요. 서버가 자격 증명이 포함된 요청을 받으면 다음 HTTP 헤더로 응답합니다.

Server 헤더 설정

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"}
로그인 후 복사

쿠키 가져오기 성공


3. Notes

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 도메인 간 접근 시 쿠키 손실에 대한 해결 방법을 설명합니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 참고하세요.

관련 권장 사항:

mysql의 key_len 계산 방법에 대한 설명 explain

curl을 사용하여 PHP를 통해 IP 및 소스 액세스를 시뮬레이션하는 방법

mysql을 통해 NULL 데이터 방법을 변환

위 내용은 Ajax 도메인 간 액세스 시 쿠키 손실에 대한 솔루션에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿