찾다
웹 프론트엔드JS 튜토리얼크로스 도메인 웹 개발을 사용하는 방법

이번에는 크로스 도메인 웹 개발 사용 방법을 알려드리겠습니다. 크로스 도메인 웹 개발 사용 시 주의 사항은 무엇인가요?

웹 개발 과정에서 모든 사람은 크로스 도메인과 접촉하게 됩니다. 많은 사람들은 크로스 도메인이 무엇인지, 웹 개발에서 크로스 도메인을 해결하는 방법을 모릅니다. 다음 기사에서는 이에 대한 자세한 소개를 제공합니다. 관심이 있으시면 교차 도메인 및 교차 도메인 솔루션에 대해 알아 보겠습니다.

크로스 도메인이란 무엇입니까?

개념은 다음과 같습니다. 프로토콜, 도메인 이름, 포트가 다른 한 다른 도메인으로 간주됩니다

다음은 특정 크로스 도메인 상황에 대한 자세한 설명입니다

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 다양한 도메인 이름 허용되지 않음

1. document.domain 크로스 도메인

원칙: 기본 도메인 이름은 동일하지만 하위 도메인 이름이 다른 페이지의 경우 document.domain을 설정하여 동일한 도메인으로 만들 수 있습니다document.domain让它们同域

限制:同域document提供的是页面间的互操作,需要载入iframe页面

下面几个域名下的页面都是可以通过document.domain跨域互操作的: http://a.com/foo, http://b.a.com/bar, http://c.a.com/bar。 但只能以页面嵌套的方式来进行页面互操作,比如常见的iframe方式就可以完成页面嵌套

// URL http://a.com/foo
var ifr = document.createElement('iframe');
ifr.src = 'http://b.a.com/bar'; 
ifr.onload = function(){
    var ifrdoc = ifr.contentDocument || ifr.contentWindow.document;
    ifrdoc.getElementsById("foo").innerHTML);
};
ifr.style.display = 'none';
document.body.appendChild(ifr);

上述代码所在的URL是http://a.com/foo,它对http://b.a.com/bar的DOM访问要求后者将 document.domain往上设置一级

// URL http://b.a.com/bar
document.domain = 'a.com'

document.domain只能从子域设置到主域,往下设置以及往其他域名设置都是不允许的, 在Chrome中给出的错误是这样的

Uncaught DOMException: Failed to set the 'domain' property on 'Document': 'baidu.com' is not a suffix of 'b.a.com'

二、有src的标签

原理:所有具有src属性的HTML标签都是可以跨域的,包括크로스 도메인 웹 개발을 사용하는 방법, <script></script>

限制:需要创建一个DOM对象,只能用于GET方法

document.body中append一个具有src属性的HTML标签, src属性值指向的URL会以GET方法被访问,该访问是可以跨域的

其实样式表的标签也是可以跨域的,只要是有src或href的HTML标签都有跨域的能力

不同的HTML标签发送HTTP请求的时机不同,例如크로스 도메인 웹 개발을 사용하는 방법在更改src属性时就会发送请求,而script, iframe, link[rel=stylesheet]只有在添加到DOM树之后才会发送HTTP请求:

var img = new Image();
img.src = 'http://some/picture';        // 发送HTTP请求
var ifr = $('<iframe>', {src: 'http://b.a.com/bar'});
$('body').append(ifr);                  // 发送HTTP请求</iframe>

三、JSONP

原理:<script>是可以跨域的,而且在跨域脚本中可以直接回调当前脚本的函数</script>

限制:需要创建一个DOM对象并且添加到DOM树,只能用于GET方法

JSONP利用的是<script>可以跨域的特性,跨域URL返回的脚本不仅包含数据,还包含一个回调</script>

// URL: http://b.a.com/foo
var data = {
    foo: 'bar',
    bar: 'foo'
};
callback(data);

然后在我们在主站http://a.com中,可以这样来跨域获取http://b.a.com的数据:

// URL: http://a.com/foo
var callback = function(data){
    // 处理跨域请求得到的数据
};
var script = $('<script>&#39;, {src: &#39;http://b.a.com/bar&#39;});
$(&#39;body&#39;).append(script);</script>

其实jQuery已经封装了JSONP的使用,我们可以这样来

$.getJSON( "http://b.a.com/bar?callback=callback", function( data ){
    // 处理跨域请求得到的数据
});

$.getJSON与$.get的区别是前者会把responseText转换为JSON,而且当URL具有callback参数时, jQuery将会把它解释为一个JSONP请求,创建一个<script>标签来完成该请求</script>

四、navigation 对象

原理:iframe之间是共享navigator对象的,用它来传递信息

要求:IE6/7

有些人注意到了IE6/7的一个漏洞:iframe之间的window.navigator对象是共享的。 我们可以把它作为一个Messenger,通过它来传递信息。比如一个简单的委托:

// a.com
navigation.onData(){
    // 数据到达的处理函数
}
typeof navigation.getData === 'function' 
    || navigation.getData()
// b.com
navigation.getData = function(){
    $.get('/path/under/b.com')
        .success(function(data){
            typeof navigation.onData === 'function'
                || navigation.onData(data)
        });
}

document.navigator类似,window.name

제한 사항: 동일한 도메인에 있는 문서는 페이지 간 상호 운용성을 제공하며 iframe 페이지를 로드해야 합니다

다음 도메인 이름 아래의 페이지는 document.domain을 통해 도메인 간에 상호 운용될 수 있습니다: http://a.com/foo, http://b.a.com/bar, http://c.a.com/bar. 하지만 페이지 상호 운용은 페이지 중첩 형식으로만 수행할 수 있습니다. 예를 들어 일반적인 iframe 메서드는 페이지 중첩

Access-Control-Allow-Origin: *              # 允许所有域名访问,或者
Access-Control-Allow-Origin: http://a.com   # 只允许所有域名访问
을 완료할 수 있습니다. 위 코드가 있는 URL은 http://a.com/foo이고 http://b.a.com/bar에 대한 DOM 액세스는 후자에서 document.domain을 한 수준 더 높게 설정해야 합니다

// URL: http://a.com/foo
var win = window.open('http://b.com/bar');
win.postMessage('Hello, bar!', 'http://b.com');
document.domain은 하위 도메인에서만 설정할 수 있으며 하위 도메인 이름으로는 설정이 허용되지 않습니다. Chrome에서 표시되는 오류는 다음과 같습니다

포착되지 않은 DOMException: '문서'에서 '도메인' 속성을 설정하지 못했습니다. 'baidu.com'은 'b.a.com'

의 접미사가 아닙니다. 2. src 태그가 있습니다

원칙: src 속성이 있는 모든 HTML 태그는 크로스 도메인 웹 개발을 사용하는 방법, <script>🎜🎜를 포함하여 크로스 도메인일 수 있습니다. 제한사항: GET 메소드에만 사용할 수 있는 DOM 객체를 생성해야 합니다🎜🎜 <code>document.body에 src 속성이 포함된 HTML 태그를 추가하세요. src 속성 값이 가리키는 URL은 GET 메소드를 사용하여 액세스할 수 있습니다🎜🎜. 실제로 스타일 시트의 <link> 태그는 도메인 간일 수도 있습니다. HTML 태그에 src 또는 href가 있는 한 도메인 간 기능도 있습니다🎜🎜 서로 다른 HTML 태그는 서로 다른 시간에 HTTP 요청을 보냅니다. 예를 들어 <img alt="크로스 도메인 웹 개발을 사용하는 방법" >는 src 속성이 변경될 때 요청을 보내는 반면, script, iframe, <code> link[rel=stylesheet]는 DOM 트리에 추가될 때에만 HTTP 요청이 전송됩니다: 🎜<pre class="brush:php;toolbar:false">// URL: http://b.com/bar window.addEventListener(&#39;message&#39;,function(event) { console.log(event.data); });🎜 3. JSONP🎜🎜 원리: <script>는 도메인 간일 수 있으며, 크로스 도메인 스크립트에서는 현재 스크립트의 기능을 직접 호출할 수 있습니다🎜🎜 제한 사항: DOM 개체를 생성하여 DOM 트리에 추가해야 하며, 이는 GET 메서드에만 사용할 수 있습니다🎜🎜 JSONP는 <script>의 도메인 간 기능을 활용합니다. 도메인 간 URL에서 반환된 스크립트에는 데이터뿐만 아니라 콜백도 포함됩니다🎜rrreee🎜 그런 다음 기본 웹사이트인 http://a.com에서 다음과 같이 도메인 전반에 걸쳐 http://b.a.com의 데이터를 얻을 수 있습니다. 🎜rrreee🎜 실제로 jQuery는 JSONP 사용을 캡슐화했으며 다음과 같이 할 수 있습니다 🎜rrreee🎜 $.getJSON과 $.get의 차이점은 전자는 responseText를 JSON으로 변환하고 URL에 콜백 매개변수가 있는 경우 jQuery는 이를 JSONP 요청으로 해석하고 <script> 태그를 생성하여 요청을 완료한다는 것입니다. 🎜 4. 탐색 개체🎜🎜 원칙: <a href="http://www.php.cn/code/651.html" target="_blank">navigator 객체는 iframe 간에 공유되며 정보를 전송하는 데 사용됩니다🎜🎜 요구사항: IE6/7🎜🎜 일부 사람들은 IE6/7의 취약점을 발견했습니다. <code>window.navigator 개체가 iframe 간에 공유됩니다. 이를 통해 정보를 전달하는 메신저로 사용할 수 있습니다. 예를 들어 간단한 위임은 다음과 같습니다. 🎜rrreeerrreee🎜 <code>document.navigator와 마찬가지로 <code>window.name도 현재 창의 모든 페이지에서 공유됩니다. 정보를 전달하는 데에도 사용할 수 있습니다. 동일한 고통스러운 방법은 Hash를 전달하는 것입니다(어떤 사람들은 이를 앵커 포인트라고 부릅니다). 이는 브라우저가 URL을 열 때마다 URL 뒤의 #xxx 부분이 유지되고 새 페이지가 여기에서 이전 페이지를 가져올 수 있기 때문입니다. .데이터🎜🎜 5. CORS(교차 도메인 리소스 공유)🎜🎜 원칙: 서버가 Access-Control-Allow-Origin HTTP 응답 헤더를 설정한 후 브라우저는 도메인 간 요청을 허용합니다🎜🎜 제한 사항: 브라우저는 HTML5를 지원해야 하며 POST, PUT 및 기타 방법을 지원할 수 있습니다🎜🎜 위에서 언급한 크로스 도메인 방식은 어떤 의미에서는 모두 해킹입니다. HTML5 표준에서 제안하는 크로스 도메인 리소스 공유(Cross Origin Resource Share, CORS)가 올바른 방식입니다. 이는 본질적으로 도메인 간 문제를 해결할 수 있는 PUT, POST 등과 같은 다른 HTTP 방법을 지원합니다. 🎜🎜 예를 들어 http://a.com에서 http://b.com의 데이터에 액세스하려는 경우 Chrome은 일반적으로 도메인 간 요청으로 인해 오류를 보고합니다🎜🎜 XMLHttpRequest는 http://b.com을 로드할 수 없습니다. 요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없으므로 'http://a.com'에 대한 액세스가 허용되지 않습니다.<p style="text-align: left;"> 错误原因是被请求资源没有设置Access-Control-Allow-Origin,所以我们在b.com的服务器中设置这个响应头字段即可<pre class="brush:php;toolbar:false">Access-Control-Allow-Origin: * # 允许所有域名访问,或者 Access-Control-Allow-Origin: http://a.com # 只允许所有域名访问<p style="text-align: left;"> 六、window.postMessage<p style="text-align: left;"> 原理:HTML5允许窗口之间<a href="http://www.php.cn/php/php-send-message.html" target="_blank">发送消息<p style="text-align: left;"> 限制:浏览器需要支持HTML5,获取窗口句柄后才能相互通信<p style="text-align: left;"> 这是一个安全的跨域通信方法,<code>postMessage(message,targetOrigin)也是HTML5引入的特性。 可以给任何一个window发送消息,不论是否同源。第二个参数可以是*但如果你设置了一个URL但不相符,那么该事件不会被分发。看一个普通的使用方式吧<pre class="brush:php;toolbar:false">// URL: http://a.com/foo var win = window.open(&#39;http://b.com/bar&#39;); win.postMessage(&#39;Hello, bar!&#39;, &#39;http://b.com&#39;);<pre class="brush:php;toolbar:false">// URL: http://b.com/bar window.addEventListener(&#39;message&#39;,function(event) { console.log(event.data); });<p style="text-align: left;"> 七、<a href="http://www.php.cn/wiki/178.html" target="_blank">访问控制安全的讨论<p style="text-align: left;"> 在HTML5之前,JSONP已经成为跨域的事实标准了,jQuery都给出了支持。 值得注意的是它只是Hack,并没有产生额外的安全问题。 因为JSONP要成功获取数据,需要跨域资源所在服务器的配合,比如资源所在服务器需要自愿地回调一个合适的函数,所以服务器仍然有能力控制资源的跨域访问<p style="text-align: left;"> 跨域的正道还是要使用HTML5提供的CORS头字段以及<code>window.postMessage, 可以支持POST, PUT等HTTP方法,从机制上解决跨域问题。 值得注意的是Access-Control-Allow-Origin头字段是资源所在服务器设置的, 访问控制的责任仍然是在提供资源的服务器一方,这和JSONP是一样的<p>相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!<p>推荐阅读:<p><br/><p><br/><!--content end--></script>

위 내용은 크로스 도메인 웹 개발을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php如何使用PHP的Intl扩展?php如何使用PHP的Intl扩展?May 31, 2023 pm 08:10 PM

PHP的Intl扩展是一个非常实用的工具,它提供了一系列国际化和本地化的功能。本文将介绍如何使用PHP的Intl扩展。一、安装Intl扩展在开始使用Intl扩展之前,需要安装该扩展。在Windows下,可以在php.ini文件中打开该扩展。在Linux下,可以通过命令行安装:Ubuntu/Debian:sudoapt-getinstallphp7.4-

如何使用CakePHP中的数据库查询构造器?如何使用CakePHP中的数据库查询构造器?Jun 04, 2023 am 09:02 AM

CakePHP是一个开源的PHPMVC框架,它广泛用于Web应用程序的开发。CakePHP具有许多功能和工具,其中包括一个强大的数据库查询构造器,用于交互性能数据库。该查询构造器允许您使用面向对象的语法执行SQL查询,而不必编写繁琐的SQL语句。本文将介绍如何使用CakePHP中的数据库查询构造器。建立数据库连接在使用数据库查询构造器之前,您首先需要在Ca

php如何使用CI框架?php如何使用CI框架?Jun 01, 2023 am 08:48 AM

随着网络技术的发展,PHP已经成为了Web开发的重要工具之一。而其中一款流行的PHP框架——CodeIgniter(以下简称CI)也得到了越来越多的关注和使用。今天,我们就来看看如何使用CI框架。一、安装CI框架首先,我们需要下载CI框架并安装。在CI的官网(https://codeigniter.com/)上下载最新版本的CI框架压缩包。下载完成后,解压缩

php如何使用PHP的Ctype扩展?php如何使用PHP的Ctype扩展?Jun 03, 2023 pm 10:40 PM

PHP是一种非常受欢迎的编程语言,它允许开发者创建各种各样的应用程序。但是,有时候在编写PHP代码时,我们需要处理和验证字符。这时候PHP的Ctype扩展就可以派上用场了。本文将就如何使用PHP的Ctype扩展展开介绍。什么是Ctype扩展?PHP的Ctype扩展是一个非常有用的工具,它提供了各种函数来验证字符串中的字符类型。这些函数包括isalnum、is

Vue 中的单文件组件是什么,如何使用?Vue 中的单文件组件是什么,如何使用?Jun 10, 2023 pm 11:10 PM

作为一种流行的前端框架,Vue能够提供开发者一个便捷高效的开发体验。其中,单文件组件是Vue的一个重要概念,使用它能够帮助开发者快速构建整洁、模块化的应用程序。在本文中,我们将介绍单文件组件是什么,以及如何在Vue中使用它们。一、单文件组件是什么?单文件组件(SingleFileComponent,简称SFC)是Vue中的一个重要概念,它

php如何使用PHP的socket编程功能?php如何使用PHP的socket编程功能?Jun 03, 2023 pm 09:51 PM

PHP是一门广泛应用于Web开发的编程语言,支持许多网络编程应用。其中,Socket编程是一种常用的实现网络通讯的方式,它能够让程序实现进程间的通讯,通过网络传输数据。本文将介绍如何在PHP中使用Socket编程功能。一、Socket编程简介Socket(套接字)是一种抽象的概念,在网络通信中代表了一个开放的端口,一个进程需要连接到该端口,才能与其它进程进行

php如何使用CI4框架?php如何使用CI4框架?Jun 01, 2023 pm 02:40 PM

PHP是一种广泛使用的服务器端脚本语言,而CodeIgniter4(CI4)是一个流行的PHP框架,它提供了一种快速而优秀的方法来构建Web应用程序。在这篇文章中,我们将通过引导您了解如何使用CI4框架,来使您开始使用此框架来开发出众的Web应用程序。1.下载并安装CI4首先,您需要从官方网站(https://codeigniter.com/downloa

php如何使用PHP的DOM扩展?php如何使用PHP的DOM扩展?May 31, 2023 pm 06:40 PM

PHP的DOM扩展是一种基于文档对象模型(DOM)的PHP库,可以对XML文档进行创建、修改和查询操作。该扩展可以使PHP语言更加方便地处理XML文件,让开发者可以快速地实现对XML文件的数据分析和处理。本文将介绍如何使用PHP的DOM扩展。安装DOM扩展首先需要确保PHP已经安装了DOM扩展,如果没有安装需要先安装。在Linux系统中,可以使用以下命令来安

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경