跨域问题,解决之道

跨域问题,在日常开发过程中,是一个非常熟悉的名词。今天的话题,结合我之前的项目场景,讨论下《跨域问题,解决之道》。

跨域是什么

跨域问题,是由于JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。换句话说,只有JavaScript存在跨域问题。

什么情况下会出现跨域

不同源访问,就算是跨域了哟。那什么才算同源呢?一般来说,同源,即同一来源,包括主机名、协议和端口号。

例如,

http://blog.720ui.com 和 http://docs.720ui.com ,是不同的二级域名,存在跨域问题。

http://blog.720ui.com 和 https://blog.720ui.com , 是不同的协议,存在跨域问题

http://blog.720ui.com 和 http://blog.720ui.com:4000 , 是不同的端口号,存在跨域问题。

http://blog.720ui.com/java/ 和 http://blog.720ui.com/about/, 虽然文件夹不同,但是是相同域名下,所以不存在跨域问题。

跨域问题普遍么

在现在前后端分离,微服务化之后,往往我们就存在许多不同的域名,这种情况下,就存在非常普遍的跨域问题。因此,跨域问题,在日常开发过程中,是一个非常熟悉的名词。那么,我们是如何去解决跨域问题呢?

解决之道

我们是如何去解决跨域问题呢?来吧,我们进入正题。

方案一,JSONP(废弃)

很早很早之前,我有个项目曾经使用过JSONP处理跨域问题。简单的理解,jsonp是带有回调函数callback的json,它是一个很棒的方案,可用于解决主流浏览器的跨域数据访问的问题。但是,JSONP方案的局限性在于,JSONP只能实现GET请求。随着现在RESTful的兴起,JSONP显得力不从心了。因为,RESTful不仅有GET,还存在POST、PUT、PATCH、DELETE。

方案二,CORS(常用)

CORS 全称为 Cross Origin Resource Sharing(跨域资源共享)。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,但用户不会有感觉。因此,实现CORS通信的关键是服务端。服务端只需添加相关响应头信息,即可实现客户端发出 AJAX 跨域请求。

值得注意的是,浏览器必须先以 OPTIONS 请求方式发送一个预请求,从而获知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许该跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。

我们绝大多数项目采取这个方案,实现细节,不再扩展,如果有疑问,可以关注公众号私信,或者评论留言哟。

但是,不幸的是,CORS不支持IE8、IE9,如果产品不再考虑兼容IE低版本的话,可以忽略,但是如果产品需要兼容目前国内还存在大量低版本的IE市场(百分之二十多),那么这个需要慎重考虑咯。

附图,留念。

跨域问题,解决方案-Nginx反向代理

方案三,搭建中间转发层(常用)

跨域问题的核心是什么?不同源访问。是啊,如果我们转换成同源请求,就不存在这个问题啦。

因此,我们之前有个项目,通过搭建中间层,当然可以是java,也可以是node.js,通过将服务端的请求进行转发,换句话说,就是dispatcher了一层,那么前端请求的地址,就被转发了,所以很好的解决跨域问题。

当然,如果对性能有考量的产品,就需要慎重选择这个方案咯,因为多了一层中间转发,不管是网络开销,还是性能负载都是有一定的影响。

方案四,Nginx反向代理(常用)

首先,产品需要搭建一个中转nginx服务器,用于转发请求。当然,我们都是基于Nginx作为反向代理,所以当然是水到渠成。

那么,Nginx的思路,就是通过Nginx解析URL地址的时候进行判断,将请求转发的具体的服务器上。

说个思路,可能有点晕,我画个图,大家就理解了。

跨域问题,解决方案-Nginx反向代理

当用户请求xx.720ui.com/server1的时候,Nginx会将请求转发给Server1这个服务器上的具体应用,从而达到跨域的目的。

总结

跨域问题,在日常开发过程中,是一个非常熟悉的名词。我们在开发过程中,或多或少都与它打过交道,因此,今天的话题,结合我之前的项目场景,以及JSONP、CORS、中间转发层、Nginx反向代理四个方案进行总结,讨论下《跨域问题,解决之道》。

解决思路

跨域问题,是由于JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。如果,我们将不同的域名整合到一个域,换句话说,通过子目录的方式划分,是不是就能解决跨域问题呢?那么,Nginx反向代理的思路,就是通过Nginx解析URL地址的时候进行判断,将请求转发的具体的服务器上。

解决跨域问题

自定义本地的url请求规则 ,如 http://www.720ui.com/blog 则对应要nginx服务转发到http://blog.720ui.com 。

配置 nginx.conf 文件,将本地带有特定前缀的URL接口请求转发到要跨域的真实物理服务器上。

Nginx服务转发请求到真实物理服务器。Nginx服务将真实物理服务器传回的数据转发给web端。

关注我:私信回复“java架构”获取往期Java高级架构资料、源码、笔记、视频

Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、

高并发等架构技术

跨域问题,解决方案-Nginx反向代理的更多相关文章

  1. vue cli 解决跨域 线上 nginx 反向代理配置

    前后分离 axios 接 api 跨域问题如图: 解决办法: 1. npm start 本地开发环境解决: 在webpack配置文件 /config/index.js 里找到 proxyTable 开 ...

  2. 前端跨域调请求 nginx反向代理

    用 本地pc的目录,请求192.168.3.246的接口,以/api为标识 运行命令: 启动 nginx -s start 重启 nginx -s relaod 停止 nginx -s stop 查看 ...

  3. 解决异地服务器接口访问跨域,node构建反向代理

    跨域对于前端来说是一个老大难的问题,许多方法如jsonp.document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识, ...

  4. Vue-cli 创建的项目配置跨域请求(通过反向代理)---配置多个代理--axios请求

    问题描述: 使用 Vue-cli 创建的项目,开发地址是 localhost:8080,需要访问 localhost:9000 或https://m.maoyan.com或http://image.b ...

  5. 前端通过Nginx反向代理解决跨域问题

    在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...

  6. 前端解决跨域问题的终极武器——Nginx反向代理

    提到代理,分为:正向代理和反向代理. 正向代理:就是你访问不了Google,但是国外有个VPN可以访问Google,你访问VPN后叫它访问Google,然后把数据传给你. 正向代理隐藏了真实的客户端. ...

  7. vue.js及H5常见跨域问题解决方案

    一.原生H5跨域问题解决方案 1.live-server 代理解决 首先在有node.js环境下,打开命令行工具,输入 npm install live-server -g 全局安装全局安装 live ...

  8. Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

    由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为 ...

  9. nginx 反向代理,支持跨域,前后分离

    前端开发往往涉及到跨域问题,其中解决方案很多: 1.jsonp 需要目标服务器配合一个callback函数. 2.window.name+iframe 需要目标服务器响应window.name. 3. ...

随机推荐

  1. js打乱数组排序

    用到的知识点:Math.random()//用于打乱数组索引 random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数. var arr=[1,2,3,4,5,6]; for( ...

  2. 使用Gin+WebSocket在HTML中无插件播放RTSP

    在后台的开发中遇到了对接显示摄像头视频流的需求.目前获取海康及大华等主流的摄像头的视频流使用的基本都是RTSP协议.不过HTML页面并不能直接播放RTSP协议的视频流,查询了一番各种网页播放RTSP的 ...

  3. CCF-CSP题解 201803-3 URL映射

    题目要求写一个简易的URL规则和URL地址匹配的程序. 说说我的思路. 将URL规则和地址都截成片段用结构体\(<type, str[]>\)存储.对于URL规则,\(type\)为0代表 ...

  4. 《Java基础知识》Java继承的概念和实现

    继承时类和类之间的关系,是一个很简单很直观的概念,与显示生活中的继承(例如儿子继承了父亲财产)类似. 继承可以理解为一个类从另一个类中获取方法和属性的过程.如果类B继承于类A,那么类B就拥有类A的属性 ...

  5. c++之程序流程控制

    三种程序运行结构:顺序结构.选择结构.循环结构. 顺序结构:程序按顺序执行,不发生跳转. 选择结构:依据条件执行不同的语句. 循环结构:判断条件是否满足,循环多次执行某段代码. 一.选择结构 //单行 ...

  6. Linux 的目录结构

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/cbbf47b0-f ...

  7. Maven使用教程二:nexus私服搭建及使用

    nexus安装 从nexus官网 下载最新的安装包 1.打开命令行,切换到nexus-3.2.1-01/bin目录下,回车.例:C:\Nexus\nexus-3.2.1-01\bin 2.输入:nex ...

  8. CSP-S 2019 游记

    目录 CSP-S 2019 游记 DAY -1 Day 0 Day 1 Day 2 后记 CSP-S 2019 游记 机房段子: zr(老师):yyx我看你最近不错哦(此人外号拳皇 yyx:运气好运气 ...

  9. python同步IO编程——基本概念和文件的读写

    IO——Input/Output,即输入输出.对于计算机来说,程序运行时候数据是在内存中的,涉及到数据交换的地方,通常是磁盘.网络等.比如通过浏览器访问一个网站,浏览器首先把请求数据发送给网站服务器, ...

  10. 形如 T(n) = a * T(n/b) + f(n) 的时间复杂度计算方法

    形如 T(n) = a * T(n/b) + f(n) 的时间复杂度计算方法 有一种方法叫做主方法(Master method)是用来专门计算这种形式的时间复杂度的,方法具体如下: 下边举例进行说明: ...