JavaScript跨域(3):HTTP access control (CORS)跨域
网上看了很多博客和文档,感觉还是Mozilla大大写的最简单、最好懂,不过文字很长。。 https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 要整篇翻译,我肯定吃不消,当然也没这个必要,下面就提要说一点吧,这个方法还存在兼容性问题,尽
网上看了很多博客和文档,感觉还是Mozilla大大写的最简单、最好懂,不过文字很长。。
https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
要整篇翻译,我肯定吃不消,当然也没这个必要,下面就提要说一点吧,这个方法还存在兼容性问题,尽管有相应的解决手段,但是觉得用起来不是特别爽。
Cross-site HTTP requests are HTTP requests for resources from a different domain than the domain of the resource making the request. For instance, a resource loaded from Domain A (http://domaina.example) such as an HTML web page, makes a request for a resource on Domain B (http://domainb.foo), such as an image, using the
img
element (http://domainb.foo/image.jpg). This occurs very commonly on the web today — pages load a number of resources in a cross-site manner, including CSS stylesheets, images and scripts, and other resources.
跨站点的HTTP请求也就是从一个域名向另一个域名发送请求(POST,GET等),比如,从http://a.com向http://b.com请求一张图片(http://b.com/images.jpg),这种请求或者说这种现象是时有发生的,所以找到一个好方法来处理这类问题也是十分有必要的。
Mozilla大大说
如下,我们在http://foo.example向页面http://bar.example发送请求:
<span>var</span> invocation = <span>new</span><span> XMLHttpRequest(); </span><span>var</span> url = 'http://bar.other/resources/public-data/'<span>; </span><span>function</span><span> callOtherDomain() { </span><span>if</span><span>(invocation) { invocation.open(</span>'GET', url, <span>true</span><span>); invocation.onreadystatechange </span>=<span> handler; invocation.send(); } }</span>
可以看看服务器对浏览器的响应
GET /resources/public-data/ HTTP/1.1 <span>Host: bar.other User</span>-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<span> Accept</span>-Language: en-us,en;q=0.5<span> Accept</span>-<span>Encoding: gzip,deflate Accept</span>-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<span> Connection: keep</span>-<span>alive Referer: http:</span><span>//</span><span>foo.example/examples/access-control/simpleXSInvocation.html </span> Origin: http:<span>//</span><span>foo.example </span> <span> HTTP</span>/1.1 200 OK Date: Mon, 01 Dec 2008 00:23:53<span> GMT Server: Apache</span>/2.0.61 <span>Access-Control-Allow-Origin: *</span><span> Keep</span>-Alive: timeout=2, max=100<span> Connection: Keep</span>-<span>Alive Transfer</span>-<span>Encoding: chunked Content</span>-Type: application/xml <span> [XML Data]</span>
这些都是关于HTTP的一些数据和参数,如果不太明白的话,可以看看这本书《HTTP权威指南》
前半截是FF3.5发送的文件头请求,后半截是服务器的响应。你应该注意到了我标红的那些字,这个就是本文要讲述的重点。
在请求之前,我们也可以自己设定一些服务器要响应的内容
<span>var</span> invocation = <span>new</span><span> XMLHttpRequest(); </span><span>var</span> url = 'http://bar.other/resources/post-here/'<span>; </span><span>var</span> body = '<?xml version="1.0"?><person><name>Arun</name></person>'<span>; </span><span>function</span><span> callOtherDomain(){ </span><span>if</span><span>(invocation) { invocation.open(</span>'POST', url, <span>true</span><span>); <span>invocation.setRequestHeader(</span></span><span>'X-PINGOTHER', 'pingpong'</span><span><span>);</span> <span>invocation.setRequestHeader(</span></span><span>'Content-Type', 'application/xml'</span><span><span>);</span> invocation.onreadystatechange </span>=<span> handler; invocation.send(body); } ......</span>
setRequestHeader顾名思义就是设置请求头的一些参数。
上面说了半天也就是告诉大家一些服务器和客户端相关参数设置和解释,还没太涉及到跨域的东西。
Cross Domain [跨域]
这是我放到SAE上的一段代码(http://1.qianduannotes.sinaapp.com/test/ACAO.php)
<span>php </span><span>header</span>("Access-Control-Allow-Origin: *"<span>); </span><span>//</span><span>header("Access-Control-Allow-Origin: http://yourURL.com");</span> <span>echo</span> "hello world"<span>; </span>?>
如果我没加header("Access-Control-Allow-Origin: *")这句话,你通过ajax或者其他方式来请求这个数据是会报错的,不信就可以试试这个链接http://1.qianduannotes.sinaapp.com/test/ACAO_none.php
其中的“*”表示所有域都可以访问,如果将Access-Control-Allow-Origin设置为一个特定的URL,那这个文件就只能被特定URL以及他的子域(http://yoururl.com/sub/)访问。
Compatibility [兼容性]
Show all versions | IE | Firefox | Chrome | Safari | Opera | iOS Safari | Opera Mini | Android Browser | Blackberry Browser |
---|---|---|---|---|---|---|---|---|---|
2.1 | |||||||||
2.2 | |||||||||
3.2 | 2.3 | ||||||||
4.0-4.1 | 3.0 | ||||||||
8.0 | 24.0 | 4.2-4.3 | 4.0 | ||||||
9.0 | 19.0 | 25.0 | 5.1 | 5.0-5.1 | 4.1 | ||||
Current | 10.0 | 20.0 | 26.0 | 6.0 | 12.1 | 6.0 | 5.0-7.0 | 4.2 | 7.0 |
Near future | 21.0 | 27.0 | 10.0 | ||||||
Farther future | 22.0 | 28.0 |
最明显的就是IE(8、9)的bug,可以通过XDomainRequest来解决。
<span>//</span><span> 1. Create XDR object </span> <span>var</span> xdr = <span>new</span><span> XDomainRequest(); </span><span>//</span><span> 2. Open connection with server using GET method</span> xdr.open("get", "http://www.contoso.com/xdr.aspx"<span>); </span><span>//</span><span> 3. Send string data to server</span> xdr.send();
下面附上一个MSDN上的DEMO
XDomainRequest From MSDN
<span><span>html</span><span>></span> <span><span>script </span><span>type</span><span>="text/javascript"</span><span>></span> <span>var</span><span> xdr; </span><span>function</span><span> readdata() { </span><span>var</span><span> dRes </span><span>=</span><span> document.getElementById(</span><span>'</span><span>dResponse</span><span>'</span><span>); dRes.innerText </span><span>=</span><span> xdr.responseText; alert(</span><span>"</span><span>Content-type: </span><span>"</span> <span>+</span><span> xdr.contentType); alert(</span><span>"</span><span>Length: </span><span>"</span> <span>+</span><span> xdr.responseText.length); } </span><span>function</span><span> err() { alert(</span><span>"</span><span>XDR onerror</span><span>"</span><span>); } </span><span>function</span><span> timeo() { alert(</span><span>"</span><span>XDR ontimeout</span><span>"</span><span>); } </span><span>function</span><span> loadd() { alert(</span><span>"</span><span>XDR onload</span><span>"</span><span>); alert(</span><span>"</span><span>Got: </span><span>"</span> <span>+</span><span> xdr.responseText); } </span><span>function</span><span> progres() { alert(</span><span>"</span><span>XDR onprogress</span><span>"</span><span>); alert(</span><span>"</span><span>Got: </span><span>"</span> <span>+</span><span> xdr.responseText); } </span><span>function</span><span> stopdata() { xdr.abort(); } </span><span>function</span><span> mytest() { </span><span>var</span><span> url </span><span>=</span><span> document.getElementById(</span><span>'</span><span>tbURL</span><span>'</span><span>); </span><span>var</span><span> timeout </span><span>=</span><span> document.getElementById(</span><span>'</span><span>tbTO</span><span>'</span><span>); </span><span>if</span><span> (window.XDomainRequest) { xdr </span><span>=</span> <span>new</span><span> XDomainRequest(); </span><span>if</span><span> (xdr) { xdr.onerror </span><span>=</span><span> err; xdr.ontimeout </span><span>=</span><span> timeo; xdr.onprogress </span><span>=</span><span> progres; xdr.onload </span><span>=</span><span> loadd; xdr.timeout </span><span>=</span><span> tbTO.value; xdr.open(</span><span>"</span><span>get</span><span>"</span><span>, tbURL.value); xdr.send(); } </span><span>else</span><span> { alert(</span><span>'</span><span>Failed to create</span><span>'</span><span>); } } </span><span>else</span><span> { alert(</span><span>'</span><span>XDR doesn</span><span>'</span><span>t exist</span><span>'</span><span>); } } <h2 id="XDomainRequest">XDomainRequest</h2> <input type="text" id="tbURL" value="http://www.contoso.com/xdr.txt"></span></span></span>
Reference [参考资料]
1.Mozilla
2.MSDN
3.http://caniuse.com/
4.屈屈(关闭了页面,链接给忘了,^_^)

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











1. Windows 11에서 설정을 엽니다. Win+I 단축키나 다른 방법을 사용할 수 있습니다. 2. 앱 섹션으로 이동하여 앱 및 기능을 클릭합니다. 3. 백그라운드에서 실행되는 것을 방지하려는 애플리케이션을 찾으세요. 점 3개 버튼을 클릭하고 고급 옵션을 선택합니다. 4. [백그라운드 애플리케이션 권한] 섹션을 찾아 원하는 값을 선택하세요. 기본적으로 Windows 11은 전원 최적화 모드를 설정합니다. 이를 통해 Windows는 애플리케이션이 백그라운드에서 작동하는 방식을 관리할 수 있습니다. 예를 들어, 배터리를 절약하기 위해 배터리 절약 모드를 활성화하면 시스템은 모든 앱을 자동으로 닫습니다. 5. 애플리케이션이 백그라운드에서 실행되는 것을 방지하려면 [안함]을 선택합니다. 프로그램이 알림을 보내지 않거나 데이터를 업데이트하지 못하는 경우 등을 확인할 수 있습니다.

DeepSeek은 파일을 PDF로 직접 변환 할 수 없습니다. 파일 유형에 따라 공통 문서 (Word, Excel, PowerPoint) : Microsoft Office, LibreOffice 및 기타 소프트웨어를 사용하여 PDF로 내보내십시오. 이미지 : 이미지 뷰어 또는 이미지 처리 소프트웨어를 사용하여 PDF로 저장하십시오. 웹 페이지 : 브라우저의 "PDF로 인쇄"기능 또는 전용 웹 페이지에서 PDF 도구를 사용하십시오. 드문 형식 : 오른쪽 변환기를 찾아 PDF로 변환하십시오. 올바른 도구를 선택하고 실제 상황에 따라 계획을 개발하는 것이 중요합니다.

Oracle은 다음 단계를 통해 dbf 파일을 읽을 수 있습니다. 외부 테이블을 만들고 dbf 파일을 참조하여 데이터를 Oracle 테이블로 가져옵니다.

Java 리플렉션 메커니즘을 사용하면 프로그램은 소스 코드를 수정하지 않고도 클래스의 동작을 동적으로 수정할 수 있습니다. Class 객체를 통해 클래스를 조작하면 newInstance()를 통해 인스턴스를 생성하고, 프라이빗 필드 값을 수정하고, 프라이빗 메서드를 호출하는 등의 작업을 수행할 수 있습니다. 그러나 리플렉션은 예상치 못한 동작 및 보안 문제를 일으킬 수 있고 성능 오버헤드가 있으므로 주의해서 사용해야 합니다.

Java 함수 개발 시 일반적인 예외 유형 및 해당 복구 방법 Java 함수를 개발하는 동안 다양한 예외가 발생할 수 있으며 이는 함수의 올바른 실행에 영향을 미칩니다. 다음은 일반적인 예외 유형과 해당 복구 방법입니다. 1. NullPointerException 설명: 초기화되지 않은 개체에 액세스할 때 발생합니다. 수정 사항: 개체를 사용하기 전에 개체가 null이 아닌지 확인하세요. 샘플 코드: try{Stringname=null;System.out.println(name.length());}catch(NullPointerExceptione){

Vue에서 iframe 교차 도메인 문제를 해결하는 방법: CORS: 백엔드 서버에서 CORS 지원을 활성화하고 XMLHttpRequest를 사용하거나 API를 가져와 Vue에서 CORS 요청을 보냅니다. JSONP: 백엔드 서버의 JSONP 엔드포인트를 사용하여 Vue에서 JSONP 스크립트를 동적으로 로드합니다. 프록시 서버: 요청을 전달하도록 프록시 서버를 설정하고, Vue에서 타사 라이브러리(예: axios)를 사용하여 요청을 보내고, 프록시 서버 URL을 설정합니다.

C++에서 HTTP 스트리밍을 구현하는 방법은 무엇입니까? Boost.Asio 및 asiohttps 클라이언트 라이브러리를 사용하여 SSL 스트림 소켓을 생성합니다. 서버에 연결하고 HTTP 요청을 보냅니다. HTTP 응답 헤더를 수신하고 인쇄합니다. HTTP 응답 본문을 수신하여 인쇄합니다.

어제 BotanixLabs는 Polychain Capital, Placeholder Capital 등의 참여로 총 1,150만 달러의 자금 조달을 완료했다고 발표했습니다. 자금 조달은 BTCL2Botanix와 동등한 분산형 EVM을 구축하는 데 사용됩니다. Spiderchain은 EVM의 사용 편의성과 비트코인의 보안을 결합합니다. 2023년 11월 테스트넷이 시작된 이후 활성 주소는 200,000개가 넘었습니다. Odaily는 이번 기사에서 Botanix의 특징적인 메커니즘과 테스트넷 상호 작용 프로세스를 분석할 것입니다. Botanix 공식 정의에 따르면 Botanix는 비트코인을 기반으로 구축된 분산형 Turing-complete L2EVM이며 두 가지 핵심 구성 요소로 구성됩니다. Ethereum Virtual Machine
