当前位置:网站首页 > 前端开发 > 正文

前端跨域解决方案有哪些(前端跨域解决方案有哪些类型)



什么是跨域?

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

这里说明一下,无法跨域是浏览器对于用户安全的考虑,如果自己写个没有同源策略的浏览器,完全不用考虑跨域问题了。

同源策略

同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。

所谓同源是指,域名,协议,端口相同。

当一个浏览器的两个tab页中分别打开百度和谷歌的页面,当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。 如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。

重点来了:浏览器的行为,那避开浏览器就好了

同源策略限制了一下行为:

  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM 和 JS 对象无法获取
  • Ajax请求发送不出去

说的更直白一点,就是我们在前端使用ajax发送异步请求,如果这个请求的URL地址与当前地址栏中的URL地址协议不同、域名不同、端口不同时,都成为跨域,例如:

通常为了减轻web服务器的负载,我们把js、css,img等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实现跨域通信。

JSONP(JSON with Padding: 填充式JSON),应用于JSON的一种新方法。

JSON、JSONP的区别:

  • JSON返回的是一串数据,JSONP返回的是脚本代码(包含一个函数调用)
  • JSONP只支持get请求、不支持post请求(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

举例:
1.原生实现:

 
  

2.jQuery Ajax:

 
  

3.Vue.js :

 
  

后端node.js代码实例:

 
  

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求,则前后端都需要设置。

需注意的是:由于同源策略的限制,所读取的cookie为跨域请求接口所在域的cookie,而非当前页。如果想实现当前页cookie的写入,可参考下文:nginx反向代理 和 NodeJs中间件代理

目前,所有浏览器都支持该功能(IE8+:IE8/9需要使用XDomainRequest对象来支持CORS)),CORS也已经成为主流的跨域解决方案。

后端修改请求头:
header(‘Access-Control-Allow-Origin:*’);允许访问的网址
header(‘Access-Control-Allow-Method:POST,GET’);允许访问的方式

例如:www.demo1.com/index.html(demo1)需要调用www.demo2.com/server.php(demo2),可以写一个接口www.demo1.com/server.php,由这个接口在后端去调用www.demo2.com/server.php并拿到返回值,然后再返回给index.html

浏览器是禁止跨域的,但是服务端不禁止

 nginx配置解决iconfont跨域

浏览器跨域访问js、css、img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在nginx的静态资源服务器中加入以下配置。

 
  

nginx反向代理接口跨域

跨域原理: 同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。

实现思路:通过nginx配置一个代理服务器(域名与demo1相同,端口不同)做跳板机,反向代理访问demo2接口,并且可以顺便修改cookie中demo信息,方便当前域cookie写入,实现跨域登录。

nginx具体配置:

 
  

前端代码示例:

 
  

Nodejs后台示例:

 
  

简介:postMessage是h5引入的一个新概念,现在也在进一步的推广和发展中,他进行了一系列的封装,我们可以通过window.postMessage的方式进行使用,并可以监听其发送的消息;
兼容性:移动端可以放心用,但是pc端需要做降级处理
优点:不需要后端介入就可以做到跨域,一个函数外加俩个参数(请求url,发送数据)就可以搞定;
移动端兼容性好;
缺点:无法做到一对一的传递方式:监听中需要做很多消息的识别,由于postMessage发出的消息对于同一个页面的不同功能相当于一个广播的过程,该页面的所有onmessage都会收到,所以需要做消息的判断;
安全性问题:
三方可以通过截获,注入html或者脚本的形式监听到消息,从而能够做到篡改的效果,所以在postMessage和onMessage中一定要做好这方面的限制;发送的数据会通过结构化克隆算法进行序列化,所以只有满足该算法要求的参数才能够被解析,否则会报错,如function就不能当作参数进行传递;





用法:postMessage(data,origin)方法接受两个参数
data: html5规范支持任意基本类型或可复制的对象,但部分浏览器只支持字符串,所以传参时最好用JSON.stringify()序列化。
origin: 协议+主机+端口号,也可以设置为"*",表示可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

示例代码:

a.html:(www.demo1.com/a.html)

 
  

b.html:(www.demo2.com/b.html)

 
  

node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。

利用node + express + http-proxy-middleware搭建一个proxy服务器。(2次跨域)

前端代码示例:

 
  

代理服务器(中间件):

 
  

Nodejs后台:

 
  

vue框架的跨域(1次跨域)

利用node + webpack + webpack-dev-server代理接口跨域。在开发环境下,由于vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域,无须设置headers跨域信息了。

webpack.config.js部分配置:

 
  

前端代码:

 
  

Nodejs socket后台:

到此这篇前端跨域解决方案有哪些(前端跨域解决方案有哪些类型)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就! 
  

                            

版权声明


相关文章:

  • 前端跨域的常用解决方式(前端跨域的常用解决方式有哪些)2025-10-25 22:27:07
  • 前端模块化解决方案(前端模块化规范标准)2025-10-25 22:27:07
  • 什么是前端埋点(前端埋点怎么写)2025-10-25 22:27:07
  • 前端工作面试(前端面试简单)2025-10-25 22:27:07
  • 前端工程化和模块化的理解与认识(前端工程化 模块化)2025-10-25 22:27:07
  • 前端工程化的理解面试题(前端工程化的理解面试题怎么做)2025-10-25 22:27:07
  • 前端跨域的解决方案(前端跨域的解决方案包括)2025-10-25 22:27:07
  • 前端埋点(前端埋点是什么意思)2025-10-25 22:27:07
  • 前端富文本框(前端富文本框 从word复制的)2025-10-25 22:27:07
  • 跨域是什么(跨域是什么,如何解决跨域前端)2025-10-25 22:27:07
  • 全屏图片