<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>跨域通信 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E8%B7%A8%E5%9F%9F%E9%80%9A%E4%BF%A1/</link><description>Recent content in 跨域通信 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 10 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E8%B7%A8%E5%9F%9F%E9%80%9A%E4%BF%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>跨域通信</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-012/</link><pubDate>Mon, 14 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-012/</guid><description>&lt;h2 id="什么是跨域"&gt;什么是跨域&lt;/h2&gt;
&lt;p&gt;在了解跨域之前，我们必须要了解一下同源策略。 跨域问题其实就是浏览器的同源策略造成的。&lt;/p&gt;
&lt;h3 id="同源策略"&gt;同源策略&lt;/h3&gt;
&lt;p&gt;同源策略限制了从同一个源加载的文档或脚本如何与另一个源的资源进行交互。这是浏览器的一个用于隔离潜在恶意文件的重要的安全机制。同源指的是：&lt;strong&gt;协议&lt;/strong&gt;、&lt;strong&gt;端口号&lt;/strong&gt;、&lt;strong&gt;域名&lt;/strong&gt;必须一致。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;跨源资源共享&lt;/strong&gt;（[CORS]，或通俗地译为跨域资源共享）是一种基于 [HTTP] 头的机制，该机制通过允许服务器标示除了它自己以外的其他[源] （域、协议或端口），使得浏览器允许这些源访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求，该机制通过浏览器发起一个到服务器托管的跨源资源的“预检”请求。在预检中，浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="为什么会产生跨域"&gt;为什么会产生跨域&lt;/h2&gt;
&lt;p&gt;下表给出了与 URL &lt;a href="http://wmq.com/dir/page.html"&gt;wmq.com/dir/page.ht…&lt;/a&gt; 的源进行对比的示例:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;是否跨域&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com/dir/page.html"&gt;wmq.com/dir/page.ht…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;同源&lt;/td&gt;
&lt;td&gt;完全相同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com/dir/inner/another.html"&gt;wmq.com/dir/inner/a…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;同源&lt;/td&gt;
&lt;td&gt;只有路径不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://wmq.com/secure.html"&gt;wmq.com/secure.html&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;协议不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://wmq.com:81/dir/etc.html"&gt;wmq.com:81/dir/etc.htm…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;端口不同 ( http:// 默认端口是80)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://news.company.com/dir/other.html"&gt;news.company.com/dir/other.h…&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;跨域&lt;/td&gt;
&lt;td&gt;主机不同&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;同源策略：protocol（协议）、domain（域名）、port（端口）三者必须一致。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;同源政策主要限制了三个方面：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前域下的 js 脚本不能够访问其他域下的 cookie、localStorage 和 indexDB。&lt;/li&gt;
&lt;li&gt;当前域下的 js 脚本不能够操作访问操作其他域下的 DOM。&lt;/li&gt;
&lt;li&gt;当前域下 ajax 无法发送跨域请求。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;源政策的目的主要是为了保证用户的信息安全，它只是对 js 脚本的一种限制，并不是对浏览器的限制，对于一般的 img、或者script 脚本请求都不会有跨域的限制，这是因为这些操作都不会通过响应结果来进行可能出现安全问题的操作。&lt;/p&gt;
&lt;h2 id="有哪些解决跨域的办法"&gt;有哪些解决跨域的办法&lt;/h2&gt;
&lt;h3 id="cors"&gt;CORS&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CORS&lt;/strong&gt;: 通过设置服务器端的响应头来允许跨域请求。这需要在服务器端进行配置，以允许特定的来源访问资源。例如，在Node.js的Express框架中，可以使用以下代码来设置CORS：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;express&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;express&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;use&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;req&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Origin&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许所有来源访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Headers&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Origin, X-Requested-With, Content-Type, Accept&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许的请求头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Access-Control-Allow-Methods&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;GET, POST, PUT, DELETE, OPTIONS&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 允许的请求方法
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 其他路由和中间件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;listen&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3000&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Server is running on port 3000&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="减少options请求次数"&gt;减少OPTIONS请求次数&lt;/h4&gt;
&lt;p&gt;在跨域请求中，浏览器会自动处理一些非简单请求的预检流程，这包括&amp;quot;预检请求&amp;quot;（也被称为CORS预检请求）和&amp;quot;OPTIONS请求&amp;quot;。预检请求是发起一个HTTP OPTIONS请求到服务器，以确认目标资源是否支持跨域。这种机制是为了兼容同源策略而产生的，但有时这种额外的请求会导致性能问题。&lt;/p&gt;</description></item></channel></rss>