网站跨域请求解决办法

跨域问题:两个项目之间使用ajax(类似于后台的httpclient)实现通讯,如果浏览器访问的域名地址与ajax访问的地址不一致的情况下,默认浏览器会有安全机制,会无法获取到访问结果(其实项目B已经响应了,但是浏览器不展示出来)。

浏览器访问的域名地址是a.itmayiedu.com:8080

而ajax访问的域名地址却是b.itmayiedu.com:8081

此时就会有网站跨域问题

跨域问题演示

项目A:一个springboot项目,端口8082

项目B:工作项目,端口7001

先在host文件中,配置上不同的域名

  127.0.0.1       a.itmayiedu.com      #项目A
  127.0.0.1       b.itmayiedu.com      #项目B

项目A通过页面的ajax访问项目B的一个接口

页面ajax:

浏览器响应结果:

console报错信息:

network(项目B已响应):

所以跨域问题是浏览器的安全策略,并不是因为项目A访问不到项目B。

跨域问题解决方法

1、使用jsonp(只支持get请求,不支持post请求,不推荐使用)

修改ajax

修改项目B后台

效果:

从上面的url可以看出,在向项目B发送请求的时候,url后面带了一个jsonpCallback的参数,参数值是一个随机数,而响应结果必须把这个随机数带回来。

2、使用HTTPClient进行转发(会发送两次请求,效率较低)

第一次请求,通过ajax发送到项目A后台

再在后台通过HttpClient进行转发,其实就不是跨域问题了,跨域是针对前台发送的请求。

===============================

调试过程中发现一个问题,记录一下:

JSONObject的fromObject方法,对于json形式的字符串,若是value是字符串类型,应该用单引号再扩一下,要不然报错

map.put("status", "200");
map.put("msg", "'success'");

==============================

3、设置响应头允许跨域(推荐)

很简单,在被访问的项目B接口上添加一个代码,设置一个响应头的参数即可

*表示所有的域名都是允许跨域的,此代码应该放在过滤器中。

4、使用nginx搭建API网关

具体详见nginx学习笔记

ajax配置如下:

ajax访问的域名地址跟浏览器的一样

nginx配置如下:

再由ngnix反向代理到项目B

5、使用Zuul微服务搭建API接口网关

等学习Zuul时再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值