[전] js 크로스 도 메 인 해결 방법
무엇이 크로스 필드 입 니까?
자 바스 크 립 트 는 보안 을 고려 하여 다른 페이지 의 대상 을 크로스 필드 에서 호출 할 수 없습니다.그러나 안전 제한 과 함께 iframe 이나 ajax 응용 에 도 많은 번 거 로 움 을 가 져 왔 다.여기 서 크로스 필드 와 관련 된 몇 가지 문 제 를 간단하게 정리 합 니 다.
먼저 크로스 필드 가 무엇 인지 간단하게 이해 하 는 것 은 자바 스 크 립 트 동원 정책 의 제한 때 문 입 니 다. a. com 도 메 인 이름 의 js 는 b. com 이나 c. a. com 도 메 인 이름 의 대상 을 조작 할 수 없습니다.더 자세 한 설명 은 다음 표를 볼 수 있다.
URL
설명 하 다.
통신 허용 여부
http://www.a.com/a.js http://www.a.com/b.js
같은 도 메 인 이름 아래
허락 하 다.
http://www.a.com/lab/a.js http://www.a.com/script/b.js
같은 도 메 인 이름 아래 다른 폴 더
허락 하 다.
http://www.a.com:8000/a.js http://www.a.com/b.js
같은 도 메 인 이름, 다른 포트
불허
http://www.a.com/a.js https://www.a.com/b.js
같은 도 메 인 이름, 다른 프로 토 콜
불허
http://www.a.com/a.js http://70.32.92.74/b.js
도 메 인 이름과 도 메 인 이름 대응 ip
불허
http://www.a.com/a.js http://script.a.com/b.js
주 도 메 인 은 같 고, 자 도 메 인 은 다르다.
불허
http://www.a.com/a.js http://a.com/b.js
같은 도 메 인 이름, 다른 2 급 도 메 인 이름 (같은 위)
허용 되 지 않 음 (쿠키 의 경우 에 도 접근 이 허용 되 지 않 음)
http://www.cnblogs.com/a.js http://www.a.com/b.js
다른 도 메 인 이름
불허
특히 두 가 지 를 주의해 야 한다. 첫째, 프로 토 콜 과 포트 로 인 한 크로스 도 메 인 문제 인 '프론트 데스크' 는 어 쩔 수 없다. 둘째, 크로스 도 메 인 문제 에 있어 도 메 인 은 'URL 의 첫 번 째 부분' 을 통 해 만 식별 되 고 똑 같은 ip 주소 가 두 도 메 인 이나 두 도 메 인 이 같은 ip 에 대응 하 는 지 판단 하려 고 하지 않 는 다.
'URL 의 첫 번 째 부분' 은 window. location. protocol + window. location. host 를 말 하 며 'Domains, protocols and ports must match' 로 도 이해 할 수 있다.
다음은 '프론트 데스크 톱' 에서 크로스 도 메 인 을 처리 하 는 방법 을 간단하게 정리 하 겠 습 니 다. 백 스테이지 proxy 라 는 방안 은 백 스테이지 설정 과 관련 되 어 있 습 니 다. 여기 서 설명 하지 않 겠 습 니 다. 관심 있 는 것 은 야후 의 이 글 을 볼 수 있 습 니 다.
1. document. domain + iframe 설정
주 도 메 인 이 같 고 자 도 메 인 이 다른 예 에 대해 서 는 document. domain 을 설정 하 는 방법 으로 해결 할 수 있 습 니 다.구체 적 인 방법 은http://www.a.com/a.html화해시키다http://script.a.com/b.html두 파일 에 각각 document. domain = 'a. com' 을 추가 합 니 다.그리고 a. html 파일 을 통 해 iframe 을 만 들 고 iframe 의 contentDocument 를 제어 하면 두 js 파일 사이 에 '상호작용' 을 할 수 있 습 니 다.물론 이 방법 은 주 도 메 인 이 같 고 2 급 도 메 인 이름 이 다른 상황 만 해결 할 수 있 습 니 다. 만약 에 기상천외 하 게 script. a. com 의 dominan 을 alibaba. com 으로 설정 하면 잘못된 보고 가 될 것 입 니 다!코드 는 다음 과 같 습 니 다:
www. a. com 의 a. html
document.domain = 'a.com';
var ifr = document.createElement('iframe');
ifr.src = 'http://script.a.com/b.html';
ifr.style.display = 'none';
document.body.appendChild(ifr);
ifr.onload = function(){
var doc = ifr.contentDocument || ifr.contentWindow.document;
// b.html
alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
};
script. a. com 의 b. html
document.domain = 'a.com';
이 방식 은 {www. kuqin. com, kuqin. com, script. kuqin. com, css. kuqin. com} 의 모든 페이지 가 서로 통신 하 는 데 적 용 됩 니 다.
비고: 한 페이지 의 domain 은 기본적으로 window. location. hostname 과 같 습 니 다.주 도 메 인 이름 은 ww 가 없 는 도 메 인 이름 입 니 다. 예 를 들 어 a. com, 주 도 메 인 이름 앞 에 접 두 사 를 가 진 것 은 보통 2 급 도 메 인 이름 이나 다단 계 도 메 인 이름 입 니 다. 예 를 들 어 www. a. com 은 2 급 도 메 인 이름 입 니 다.domain 은 도 메 인 이름 만 설정 할 수 있 고 b. a. com 에서 domain 을 c. a. com 으로 설정 할 수 없습니다.문제: 1. 안전성, 한 사이트 (b. a. com) 가 공격 당 하면 다른 사이트 (c. a. com) 가 보안 구멍 을 일 으 킬 수 있 습 니 다.2. 한 페이지 에 여러 개의 iframe 을 도입 하면 모든 iframe 을 조작 하려 면 같은 domain 을 설정 해 야 합 니 다.
2. 동적 생 성 script
브 라 우 저 는 기본적으로 크로스 도 메 인 접근 을 금 지 했 지만 페이지 에서 다른 도 메 인 JS 파일 을 참조 하 는 것 을 금지 하지 않 고 도 입 된 JS 파일 의 function (조작 쿠키, Dom 등 포함) 을 자 유 롭 게 실행 할 수 있 습 니 다.이 점 에 따라 script 노드 를 만 드 는 방법 으로 완전 도 메 인 간 통신 을 편리 하 게 실현 할 수 있 습 니 다.구체 적 인 방법 은 YUI 의 Get Utility 를 참고 할 수 있 습 니 다.
script 노드 로 딩 이 끝 났 는 지 판단 하 는 것 이 재 미 있 습 니 다. ie 는 script 의 readystatechange 속성 만 통과 할 수 있 고 다른 브 라 우 저 는 script 의 load 이벤트 입 니 다.다음은 script 로드 완료 부분 을 판단 하 는 방법 입 니 다.
js.onload = js.onreadystatechange = function() {
if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') {
// callback
js.onload = js.onreadystatechange = null;
}
};
3. iframe 과 location. hash 를 이용 하여
이 방법 은 비교적 복잡 하지만 완전히 도 메 인 을 넘 는 상황 에서 의 걸음 교체 문 제 를 해결 할 수 있다.원 리 는 location. hash 를 이용 하여 값 을 전달 하 는 것 이다.url:http://a.com#helloword'\ # helloworld' 는 location. hash 입 니 다. hash 를 바 꾸 면 페이지 가 새로 고침 되 지 않 기 때문에 hash 값 을 이용 하여 데이터 전달 을 할 수 있 습 니 다. 물론 데이터 용량 은 제한 되 어 있 습 니 다.도 메 인 이름 a. com 의 파일 cs1. html 가 cnblogs. com 도 메 인 이름 의 cs2. html 와 정 보 를 전달 해 야 한다 고 가정 하면 cs1. html 는 먼저 숨겨 진 iframe 을 자동 으로 만 들 고 iframe 의 src 는 cnblogs. com 도 메 인 이름 의 cs2. html 페이지 를 가리 키 며 이때 hash 값 은 매개 변수 로 전달 할 수 있 습 니 다.cs2. html 응답 요청 후 cs1. html 의 hash 값 을 수정 하여 데 이 터 를 전달 합 니 다.또한 cs1. html 에 타 이 머 를 추가 하여 일정 시간 간격 으로 location. hash 의 값 이 변 했 는 지 판단 하고 변화 가 있 으 면 hash 값 을 가 져 옵 니 다.코드 는 다음 과 같 습 니 다:
먼저 a. com 의 파일 cs1. html 파일:
function startRequest(){
var ifr = document.createElement('iframe');
ifr.style.display = 'none';
ifr.src = 'http://www.cnblogs.com/lab/cscript/cs2.html#paramdo';
document.body.appendChild(ifr);
}
function checkHash() {
try {
var data = location.hash ? location.hash.substring(1) : '';
if (console.log) {
console.log('Now the data is '+data);
}
} catch(e) {};
}
setInterval(checkHash, 2000);
cnblogs. com 도 메 인 이름 의 cs2. html:
//
switch(location.hash){
case '#paramdo':
callBack();
break;
case '#paramset':
//do something……
break;
}
function callBack(){
try {
parent.location.hash = 'somedata';
} catch (e) {
// ie、chrome parent.location.hash,
// cnblogs iframe
var ifrproxy = document.createElement('iframe');
ifrproxy.style.display = 'none';
ifrproxy.src = 'http://a.com/test/cscript/cs3.html#somedata'; // "a.com" document.body.appendChild(ifrproxy);
}
}
a. com 의 도 메 인 이름 cs3. html
// parent.parent , location.hash
parent.parent.location.hash = self.location.hash.substring(1);
물론 이렇게 하 는 것 도 많은 단점 이 존재 한다. 예 를 들 어 데이터 가 url 에 직접 노출 되 고 데이터 용량 과 유형 이 유한 하 다 는 등 이다.
4. window. name 에서 실 현 된 크로스 필드 데이터 전송
문장 이 비교적 길 게 열거 되 어 있어 읽 기 가 불편 하 니 상세 하 게 보십시오 window. name 에서 실 현 된 크로스 필드 데이터 전송.
5 、 HTML 5 postmessage 사용
HTML 5 에서 가장 멋 진 새로운 기능 중 하 나 는 바로 크로스 문서 메시지 전송 Cross Document Messaging.차세 대 브 라 우 저 는 Chrome 2.0 +, Internet Explorer 8.0 +, Firefox 3.0 +, Opera 9.6 +, Safari 4.0 + 를 지원 합 니 다.페 이 스 북 은 웹 기반 의 실시 간 메시지 전달 을 postmessage 로 지원 하 는 이 기능 을 사용 했다.otherWindow.postMessage(message, targetOrigin);
otherWindow: 정보 페이지 를 받 는 window 에 대한 참조페이지 에 있 는 iframe 의 contentWindow 속성 일 수 있 습 니 다.window. open 의 반환 값;name 이나 아래 표 시 를 통 해 window. frames 에서 가 져 온 값 입 니 다.
message: 보 낼 데이터, string 형식 입 니 다.
targetOrigin: otherWindow 를 제한 하 는 데 사용 되 며, "*" 는 제한 하지 않 음 을 표시 합 니 다.
a. com / index. html 의 코드:
<iframe id="ifr" src="b.com/index.html"></iframe>
<script type="text/javascript">
window.onload = function() {
var ifr = document.getElementById('ifr');
var targetOrigin = 'http://b.com'; // 'http://b.com/c/proxy.html' // 'http://c.com' postMessage ifr.contentWindow.postMessage('I was there!', targetOrigin);
};
</script>
b. com / index. html 의 코드:
<script type="text/javascript">
window.addEventListener('message', function(event){
// origin
if (event.origin == 'http://a.com') {
alert(event.data); // "I was there!"
alert(event.source); // a.com、index.html window
// , event.source window
}
}, false);
</script>
참고 글: 제5 장 - 크로스 문서 메시지 메커니즘,https://developer.mozilla.org/en/dom/window.postmessage
6. 플래시 활용
이것 은 YUI 3 의 IO 구성 요소 에서 보 이 는 방법 으로 구체 적 으로 볼 수 있다.http://developer.yahoo.com/yui/3/io/。 Adobe Developer Connection 에서 더 많은 크로스 도 메 인 프 록 시 파일 규범 을 볼 수 있 습 니 다: ross - Domain Policy File Specifications, HTTP Headers Blacklist.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.