2009-08-18 2 views
9

jQuery를 사용하여 Ajax 요청을 학습하는 과정에서 링크 클릭으로 Google 홈페이지를로드하려고했습니다. 몸에jQuery로드 메서드에서 외부 리소스를로드 할 수없는 이유는 무엇입니까?

$("#ajax").click (function (event) { 
    $("#g").html("Loading..."); 
    $("#g").load("http://www.google.com"); 
    event.preventDefault(); 
}); 

그리고 어딘가에 : 그래서 내가 좋아하는 뭔가를 썼다

<a id="ajax" href="http://www.google.com">Load file ajax way</a> 
<div id="g">Click the above link to load the page...</div> 

작동하지 않았고 처음에 나는 어떤 구문 오류 또는 무언가가 생각했다. 하지만 나중에 google URL을 서버의 정적 HTML 파일로 바꿨을 때 제대로 작동했습니다.

$("#g").load("Temp.htm"); 

이렇게 작동하도록 설계 되었습니까? 그렇다면 왜 그런가요?

편집 : 누구나 설명 할 수 있습니까 (또는 참조) 크로스 도메인 아약스 전화로 도입 된 보안 문제? 다른 말로하면 왜 다른 브라우저 탭을 열고 Google을 열지 만 페이지 내에서 열지 않았습니까? 발신자 또는 수신자를 보호하는 것입니까?

답변

34

Jquery는 ajax (XMLHttpRequest) 요청을 사용하여 데이터를로드하지만 브라우저는 동일한 도메인의 리소스에 대해이를 허용합니다. (위의 답변은 Same origin policy입니다.) Temp.htm에서는 작동하지만 www.google.com에서는 작동하지 않습니다.

  • 이 문제를 해결할 수있는 방법 중 하나는 페이지를로드하는 서버 스크립트 (기본적으로 프록시)를 만드는 것입니다. jquery-crossframe

  • 세 번째 옵션은 JSONP입니다하지만이 작동하지 않을 것입니다 : - 그럼 당신은

    $('#g').load("load.php?url=google.com") 
    
  • 다른 솔루션은 통신을 위해 iframe을 사용하는 것입니다 전화 당신이 필요한 것 같다이 라이브러리를 발견 당신 사건.

내 의견 - 서버 쪽 프록시로 첫 번째 옵션으로 이동하십시오.


왜 원본 정책이 같은가요?

귀하의 eBay 계정에서 물건을 확인한다고 상상해보십시오. 그런 다음 다른 탭에서 내 사이트를 열어서 이베이에 대한 일련의 요청을 작성하는 스크립트 (사용자는 아직 로그인되어 있습니다)를 알게되고,주의하지 않고도 Audi A8에 대한 입찰을합니다. 성가신 ... 당신의 은행 이었으면 직접 돈을 훔칠 수 있습니다.

동일한 아이디 정책에도 불구하고 위의 공격은 여전히 ​​가능합니다.

+3

+1 환상적인 답변입니다. –

+2

매우 철저하고 완전한 대답 –

+0

그래서 load.php는 쿼리 된 도메인을 읽고 내용을 저장합니까? – 3zzy

2

보안상의 이유로 도메인 간 AJAX 통화를 할 수 없습니다. Same Origin Policy을 참조하십시오.

1

이것은 보안상의 문제입니다. yahoo 이상의 솔루션을 통해 모든 정보를 읽을 수 있습니다. 모든

0

첫째, 나는

가장 큰 이유는 아마도 보안은 ... 당신이 링크가 자바 스크립트와 기본적으로 않는 무언가를 할 수있는 아주 좋은 이유가 있다고 가정해야 : 당신은 어떤 데이터에 액세스 할 수 없습니다 자바 스크립트에서 현재 도메인 외부.

+0

나는 이것을 할 이유가 없다. 나는 jQuery와 Ajax 호출을 배우기 위해 이것을하고 있었다. (순진하게도 구글을 사용하려고 시도했다.) 그래서 아마 다른 서버를 호출 할 필요는 없겠지만 필요하다면 솔루션을 아는 것은 여전히 ​​좋습니다 (Andy가 제안했습니다). – Hemant

1

자바 스크립트에서 도메인 간 요청이 완전히 배제되지는 않습니다.

jQuery 1.2부터는 JSON-P 콜백을 지정하고 JSON-P 출력을 지원하는 URL을 지정하면 다른 도메인에있는 JSON 데이터를로드 할 수 있습니다.

다음 예제는 jQuery 문서의 내용입니다. "cat"태그가 붙은 마지막 네 개의 flickr 사진을 가져옵니다.

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", 
    function(data){ 
     $.each(data.items, function(i,item){ 
     $("<img/>").attr("src", item.media.m).appendTo("#images"); 
     if (i == 3) return false; 
     }); 
    }); 

는 여기에서 문서를 읽을 수 있습니다

http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback는 개인적으로 내 서버 측 코드로 구축하지 않고도 내 블로그에 내 최신 트윗에 끌어 그것을 사용할 수 있습니다. 또한 트위터에 자주 등장하는 API 서비스에 오류 처리 코드를 작성하지 않아도된다는 이점이 있습니다. 이 포스트 request.it이 일을 보내드립니다 http://joreteg.com

0

시도 추가 htaccess.send에서

<IfModule mod_headers.c>Header add Access-Control-Allow-Origin: "http://yoursite.com/" 

일부 매개 변수

$("#g").load("http://www.google.com",{nomeaning:'nomeaning'}); 

를 사용 : 당신이 그것을보고 싶어하면 그냥 내 블로그에 소스를보기 나를 위해

관련 문제