实现跨域访问的解决方案汇总

实现跨域访问的解决方案汇总,第1张

文章目录 跨域解决方案汇总1. 浏览器客户端解决方案2. 前端代码解决方案3. 后端代码解决方案CORS对服务进行封装转发 (比如HttpClient ) 4. 代理或DNS配置 , 从不同源转为同源代理实现跨域

跨域解决方案汇总 浏览器客户端解决方案 , [临时方案]前端代码解决方案 - JSONP后端代码解决方案
3.1 CORS
3.2 对服务进行封装转发 (比如httpclient)代理或DNS配置 , 从不同源转为同源 1. 浏览器客户端解决方案

禁止跨域访问, 是浏览器的安全策略,所以修改浏览器的安全设置就可以允许跨域访问了。
修改方式是在浏览器的启动参数加上 --disable-web-security

Windows 下的修改方式是先找到浏览器的桌面快捷方式, 单击右键,选择属性,在d出对话框的 “目标”一栏增加上面的参数, 如下图:

注意, 如果是新版的Chrome(比如版本 101.0.4951.64(正式版本) (64 位)), 则需要先在建立一个目录, 比如 C:\MyChromeUserData 。启动参数如下:

--disable-web-security --user-data-dir=C:\MyChromeUserData 

启动Chrome 之后会有一个安全提示:

这种方式需要在每个客户端设置, 安全性不好,不推荐。可以临时使用或测试。

2. 前端代码解决方案

前端代码也就是JavaScriptd代码解决跨域的方案就是JSONP,虽然浏览器有同源策略的限制,但是对于 script 、link 、img以及iframe 的标签是例外的, 利用这个特性或者是漏洞可以实现跨域访问。
但是注意: 这种方式只支持GET请求方法。
一些前端库或框架也提供了 JSONP的简便调用方法,比如JQuery 和Ext JS。
关于JSONP的原理以及解决方案详情可以参考:

跨域解决方案之JSONP的解决方式汇总与示例演示跨域解决方案之—JSONP 3. 后端代码解决方案 CORS

CORS ,Cross-Origin Resource Sharing,跨域资源共享。
CORS通过添加HTTP请求的响应头参数,告知浏览器哪些不符合同源策略的状况也可以跨域访问。

这些响应头参数主要包括:

Access-Control-Allow-Origin, 接受访问的域名, 星号(*)代表接受任何域名的请求。这个值和请求头的Origin 进行比对。Access-Control-Allow-Credentials, 是否允许发送Cookie, 默认为false。设置为true 则Cookie包含在请求中,一起发送给服务器。Access-Control-Allow-Headers 允许浏览器发送的头信息Access-Control-Allow-Methods 允许跨域请求的方法Access-Control-Max-Age ,预检请求的有效期,单位秒,在这个事件内发送正式请求,不用发送预检请求(使用在复杂请求中)。

以JSP为例, 最简单的请求头设置代码如下:

response.setHeader("Access-Control-Allow-Origin", "*"); 

上面的代码是设置所有来源的站点都可以访问。在Spring Boot项目中, Spring Boot提供了更多样化、简洁和灵活的配置方式, 详细参考:
Spring Boot 跨域访问的实现方式最全汇总

对服务进行封装转发 (比如HttpClient )

将原服务地址使用httpclient进行包装, 转换为应用内部的地址, 进而将跨域的服务地址转换为本地应用的服务地址。

关于HttpClient 的使用可以参考:
HttpClient 入门与正确使用姿势

如果是访问https 的站点, 则需要使用证书或是忽略证书进行访问, 参考:

HttpClient 忽略证书直接访问https站点HttpClient 使用证书访问https站点 4. 代理或DNS配置 , 从不同源转为同源

如果不想或没有办法改动代码,也可以使用代理或是DNS的方式对服务的地址进行转换, 方式有:

代理, 接口网关DNS 配置。 将某个服务的地址进行DNS映射。比如某个服务的IP 地址是 http://172.0.0.1/service1 , 配置DNS之后将这个地址映射为与访问机器同域的地址。该方式一般使用较少。 代理实现跨域

将资源服务,包括JS , CSS , 接口服务搭建一个中间层, 所偶的浏览器及客户端访问都通过代理转发, 这样的话, 在浏览器端来看,访问的都是同一个地址的资源。
Ngnix 是常用的反向代理服务器, 基本使用可以参考 :
Windows下nginx的快速安装和使用

Ngnix 一般用于企业级的API接口网关, Zuul则可以用来搭建微服务API接口网关。Spring Boot提供了与Zuul的集成, 此外,在Spring Boot中, 也可以自定义更轻量级的代理转发器。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1296838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存