<?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/</link><description>Recent content in 跨域 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E8%B7%A8%E5%9F%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>跨域</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-024/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/javascript-024/</guid><description>&lt;h2 id="一什么是跨域"&gt;一、什么是跨域？&lt;/h2&gt;
&lt;p&gt;在前端领域中，跨域是指浏览器允许向服务器发送跨域请求，从而克服Ajax只能&lt;strong&gt;同源&lt;/strong&gt;使用的限制。&lt;/p&gt;
&lt;h3 id="什么是同源策略"&gt;什么是同源策略？&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;同源策略&lt;/strong&gt;是一种约定，由Netscape公司1995年引入浏览器，它是浏览器最核心也最基本的安全功能，如果缺少了同源策略，浏览器很容易受到XSS、CSFR等攻击。所谓同源是指&amp;quot;协议+域名+端口&amp;quot;三者相同，即便两个不同的域名指向同一个ip地址，也非同源。&lt;/p&gt;
&lt;p&gt;同源策略限制以下几种行为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cookie、LocalStorage 和 IndexDB 无法读取&lt;/li&gt;
&lt;li&gt;DOM和JS对象无法获得&lt;/li&gt;
&lt;li&gt;AJAX 请求不能发送&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二常见的跨域场景"&gt;二、常见的跨域场景&lt;/h2&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://www.domain.com/"&gt;www.domain.com/&lt;/a&gt;a.js&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://www.domain.com/"&gt;www.domain.com/&lt;/a&gt;b.js&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://www.domain.com/"&gt;www.domain.com/&lt;/a&gt;lab/c.js&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://www.domain.com/"&gt;www.domain.com&lt;/a&gt;:8000/a.js&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://www.domain.com/b.js"&gt;www.domain.com/b.js&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://www.domain.com/a.js"&gt;http://www.domain.com/a.js&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://www.domain.com/b.js"&gt;https://www.domain.com/b.js&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://www.domain.com/a.js"&gt;http://www.domain.com/a.js&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://192.168.4.12/b.js"&gt;http://192.168.4.12/b.js&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;域名和域名对应相同ip&lt;/td&gt;
&lt;td&gt;不允许&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://www.domain.com/a.js"&gt;http://www.domain.com/a.js&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://x.domain.com/b.js"&gt;http://x.domain.com/b.js&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://domain.com/c.js"&gt;http://domain.com/c.js&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://www.domain1.com/a.js"&gt;http://www.domain1.com/a.js&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://www.domain2.com/b.js"&gt;http://www.domain2.com/b.js&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;h2 id="三9种跨域解决方案"&gt;三、9种跨域解决方案&lt;/h2&gt;
&lt;h3 id="1jsonp跨域"&gt;1、JSONP跨域&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;jsonp&lt;/strong&gt;的原理就是利用&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签没有跨域限制，通过&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;标签src属性，发送带有callback参数的GET请求，服务端将接口返回数据拼凑到callback函数中，返回给浏览器，浏览器解析执行，从而前端拿到callback函数返回的数据。&lt;br&gt;
1）原生JS实现：&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; var script &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.createElement&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;script&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; script.type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;text/javascript&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;span style="display:flex;"&gt;&lt;span&gt; // 传参一个回调函数名给后端，方便后端返回时执行这个在前端定义的回调函数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; script.src &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;http://www.domain2.com:8080/login?user=admin&amp;amp;callback=handleCallback&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; document.head.appendChild&lt;span style="color:#f92672"&gt;(&lt;/span&gt;script&lt;span style="color:#f92672"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; handleCallback&lt;span style="color:#f92672"&gt;(&lt;/span&gt;res&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alert&lt;span style="color:#f92672"&gt;(&lt;/span&gt;JSON.stringify&lt;span style="color:#f92672"&gt;(&lt;/span&gt;res&lt;span style="color:#f92672"&gt;))&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;服务端返回如下（返回时即执行全局函数）：&lt;/p&gt;</description></item></channel></rss>