美文网首页服务器后端开发
跨域的原因以及解决方案

跨域的原因以及解决方案

作者: 垃圾简书_吃枣药丸 | 来源:发表于2019-03-28 12:41 被阅读100次

# 为什么会产生跨域问题

  1. 浏览器限制,目前所有浏览器都实现了同源策略规范。
  2. 请求方式Type为xhr。如果非xhr,如json,script则也不会存在跨域问题
  3. 请求方与服务方的源不同,即跨域,包括:
    1. 协议不同
    2. 域名不同
    3. 端口不同

同时满足三个条件才有可能产生跨域问题。

# 解决方案

  1. 对于浏览器限制的解决方案-关闭浏览器的同源策略
    --args --disable-web-security --user-data-dir
    设置浏览器的启动参数,将浏览器的同源策略取消。该方式要求所用的用户进行手动操作,肯定是不现实的。

  2. 请求方式Type为xhr的解决方案

    既然只有Type为xhr的请求才会存在跨域请求,那么我们是不是可以换一种请求方式呢。Jsonp的实现就是这样。将原本Type是xhr的请求伪造成script请求。

    Jsonp的请求路径后面会自动带上callback参数,服务端可据此判断是否是jsonp请求,将返回值以script的形式进行封装。且服务端需要进行相应的改动。

    对于SpringBoot项目

    @ControllerAdvice
    public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice{
        public JsonpAdvice{
            super("callback");       //约定的jsonp请求参数
        }
    }
    

    JQuery实现jsonp的原理:

    动态创建一个script,通过这个script去请求,请求完,该script即被销毁。可通过对jQuery打断点的方式验证。(可以看到JQuery在网页源代码嵌入了一个临时的script,当Jsonp请求完成之后,该Script即被销毁)

  • 弊端:
    • 服务器需要改动
    • 只支持GET方式 (因为获取script都是GET方式,前端指定请求方式也无效,还以GET方式发起的请求)
  1. 跨域的解决方案

根据实际系统架构来决定使用哪种方式

  1. 被调用方解决

    返回的响应头的包含允许跨域访问的信息,需要被调用方进行代码的修改。(可由具体应用添加允许跨域信息,也可以由容器,Tomcat,jetty等添加)

    1. 通过Filter实现
    2. 将允许跨域请求的信息配置在nginx或者apache转发服务器
image.png image.png
  1. 调用方解决
    在调用方与被调用方中间再增加一层,该层做转发,将调用方的请求转发到被调用方。其中第一点因为调用方与该转发层在同一个域名下,所以不会有跨域问题。第二点,由于不是浏览器发起的请求,所以转发层调用被调用方也是不存在跨域问题的(参见跨域的三要素)。
image.png

简单请求与非简单请求

当浏览器发起一个跨域请求的时候会先判断是简单请求还是非简单请求。

对于简单请求,浏览器会先请求,拿到结果后再判断是否跨域。

对于非简单请求,浏览器会先发起一个预检options请求,检查通过之后再发起实际的请求。

对于带cookie的跨域请求,

  1. 需要将allowedOrigins设置为具体的origin,而不能使用*
  2. 需要设置响应参数allowCredentials(true),允许带cookie的跨域

相关文章

  • 关于跨域以及解决思路

    本章内容目录:一、跨域相关概念的理解二、跨域产生的原因三、跨域的几种解决方案 一、跨域相关概念的理解 首先先了解以...

  • 跨域的原因以及解决方案

    # 为什么会产生跨域问题 浏览器限制,目前所有浏览器都实现了同源策略规范。 请求方式Type为xhr。如果非xhr...

  • Ajax跨域问题

    一、跨域问题 二、跨域的定义以及产生原因 三、解决思路 四、JSONP 五、跨域解决的方向 五、浏览器禁止检查

  • Web前后端跨域问题处理

    跨域问题有前台跨域(iframe间)和后台跨域。 前台跨域的解决方案可以采用跨域文档通讯(Cross domain...

  • 常见跨域解决方案以及Ocelot 跨域配置

    常见跨域解决方案以及Ocelot 跨域配置 Intro 我们在使用前后端分离的模式进行开发的时候,如果前端项目和a...

  • 跨域问题,解决方案

    跨域问题,解决方案 - Nginx反向代理跨域问题,解决方案 - CORS方案此为原作者的链接:跨域问题,解决之道

  • 浏览器跨域及其解决方案

    title: 浏览器跨域及其解决方案author: Maydate: 20220428 什么是跨域跨域的表现解决跨...

  • 前端如何解决常见跨域问题

    跨域解决方案 1、 通过jsonp跨域 2、 document.domain + iframe跨域 3、 loca...

  • 开发环境跨域和生产环境跨域

    开发环境跨域 前后端分离,IP地址不同,请求数据必然导致跨域问题;解决方案:proxy设置 生产环境跨域 解决方案...

  • 跨域原理以及跨域解决方案

    写在前面的话 在火热的互联网IT时代,越来越多的前端开发工程师和H5开发工程师都会遭遇到人(猿)生中一个名词:跨域...

网友评论

    本文标题:跨域的原因以及解决方案

    本文链接:https://www.haomeiwen.com/subject/xakqbqtx.html