2017-11-16 47 views
1

서버로부터의 대상 URL을 가지고 있으며 브라우저에 Ajax을 통해 Chrome 브라우저를 통해 특정 쿠키가있는 매개 변수를 보내려고합니다. 대상 URL (I 어떤 변경 설정에 대한 서버에 액세스 할 수 또는에서 스크립트를 변경하지 마십시오)의 서버의사용자 정의 쿠키가있는 Ajax 요청을 다른 도메인으로 보냅니다.

응답 헤더 :

Cache-Control:max-age=600, private, must-revalidate 
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Length:6821 
Content-Type:text/html 
Date:Thu, 16 Nov 2017 22:50:17 GMT 
Expires:Thu, 19 Nov 1981 08:52:00 GMT 
Pragma:no-cache 
Server:Apache 
Vary:Accept-Encoding 
X-Powered-By:PHP/5.5.38 

내가 그것을 시작!
먼저 테스트 액세스를 위해 CURL을 시도합니다.

curl 'http://www.foo.com/bar.php' \ 
    -H 'Cookie: PHPSESSID=vjjuo34g4gh46ajd471lt8pvn7;' \ 
    --data 'x=1&y=2' --compressed -s 

PHPSESSID 쿠키가 전송됩니다 만 중요 : 서버 액세스에 대한 필요가 특정 헤더를 설정 할 필요가 없기 때문에이 작동합니다.

응답 : 정확하고 액세스 할 수 있습니다.

참조 :
pic01

지금 내가하려고 Ajax와 로컬 크롬 브라우저 :

Failed to load http://www.foo.com/bar.php : No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:8888 ' is therefore not allowed access.

참조 :
나는 다음과 같은 오류 메시지가 나타납니다

$.ajax({ 
    type: "POST", 
    ContentType: "application/json; charset=UTF-8", 
    dataType: "json", 
    data: {x : '1', y: '2'}, 
    url: 'http://www.foo.com/bar.php', 
    complete: function(data) { 
     console.log('RESPONSE TEXT>>>>>>>>', data.responseText); 
    } 
}); 

Allow-Control-Allow-Origin 크롬 확장 프로그램을 활성화하고 다시 실행합니다.
이번엔 작동합니다. 그러나 쿠키가 전송되지 않으므로 액세스 할 수 없습니다.

응답 : 잘못되어 액세스 할 수 없습니다.

참조 :
pic03

Ajax 요청 헤더에 쿠키를 추가

beforeSend : function(xhr) { 
    xhr.setRequestHeader('Cookie', 'PHPSESSID=vjjuo34g4gh46ajd471lt8pvn7;'); 
}, 

쿠키가 설정되고 오류가 콘솔에 표시되지 않습니다, 오류 :

Refused to set unsafe header "Cookie"

응답 : 올바르지 않으며 액세스 할 수 없습니다.

참조 :
pic04

우리는 우리가 쿠키를 추가 할 수 있도록 Ajax 요청이 추가 : 어떤 일이 것은 나의 선호하는 쿠키가 설정되지 않는 것입니다

xhrFields: { 
    withCredentials: true, 
}, 

. 그러나 미리 구성된 쿠키는 요청 된 도메인에 대한 내 도메인으로 설정됩니다.
(이 쿠키는 문제가 아닌 쿠키라고 가정합니다.)
그러나 다음과 같은 메시지가 콘솔에 나타납니다 시간 :

Failed to load http://www.foo.com/bar.php : The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin ' http://localhost:8888 ' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

응답 : 올바른,하지만 EMPTY 반환! 왜?!

참조 :
pic06
pic05

당신은 요청이 필요했다 쿠키를 포함 것을 알 수있다. 그러나 data.responseText 및 JavaScript에서 정확한 응답을받지 못했습니다.
그러나 Developer Tools> Network> Response 응답 텍스트가 올바르게 표시되는 것은 이상한 일입니다.

왜 이런 일이 발생하며 결국 위 이미지의 CURL 요청과 같은 올바른 응답을 얻을 수 있습니까?

편집 :
출력 명령 console.log(data)의. 참조 :
pic07
이번에 빨간색 메시지가 변경된 것 같습니다. 또한 응답 데이터를로드 할 시간이없는 것처럼 보입니다. Response 크롬 탭!

+0

'dataType와 :이 항목에 대한 자세한 정보가 필요하면

내가 당신에게이 사이트 추천 "JSON"을'아약스 자동 객체에 JSON 응답을 구문 분석합니다. console.log (데이터)를 가지고 무엇을 가지고 있는지보십시오. – Taplar

+2

은 CORS를 우회하는 것이 ** 서버에서 CORS를 올바르게 사용하는 것보다 훨씬 어렵습니다. ** –

+0

PHP에서 cors를 활성화하는 데 유용한 리소스 https://stackoverflow.com/a/9866124/1175966 – charlietfl

답변

1

헤더 Access-Control-Allow-Origin이 서버에 설정되어 있습니다. AJAX를 사용하여 서버로부터 응답을 받으려면 이 아닌 Access-Control-Allow-Origin 헤더에 값을 추가해야합니다.

로컬 호스트에서 테스트를하고있는 것을 볼 수 있습니다. Access-Control-Allow-Origin: http://localhost/으로 설정하면 작동하지 않습니다. 서버에서 테스트 할 수 있다면 작동 할 수 있습니다.

도메인을 가지고있는 사이트에서 테스트를 수행하고 응답에 Access-Control-Allow-Origin: domain을 추가하십시오.

https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS

+0

변경 구성이나 스크립트 변경을 위해 서버에 대한 액세스 권한이 없으며 서버의 샘플 응답 헤더를 첫 번째 질문 게시 지점에 추가합니다. 또한 stackoverflow 및 첫 번째 대답을 환영합니다 .-D –