跨域问题:两个项目之间使用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时再补充。