问题显示
什么是跨域??
跨域:一个域的前端js脚本代码,访问另一个域的后端代码(controller)
学成在线
测试 上边的代理 ,结果 报错如下 :
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin
'http://localhost:11000' is therefore not allowed access.
原因:浏览器的同源策略不允许跨域访问,所谓同源策略是指协议、域名、端口相同。
为什么浏览器要遵循同源策略??
解决:采用proxyTable解决
(Vue的脚手架开发 )
cms跨域解决原理:
1、访问页面http://localhost:11000/
2 、页面请求http://localhost:11000/cms
由于 url由http://localhost:31001/cms...改为 “http://localhost:11000/cms." ,所以不存在跨域
3、通过proxyTable由node服务器代理请求 http://localhost:31001/cms.
服务端不存在跨域问题
前端:
解释:
/api/cms 是为了好区别(识别)拦截的内容
target:“http://localhost:31001” 我的理解是将原先的URL给替换掉了,并不是在新的地址上添加/cms 因为后面的参数还有的,
品优购
商品的详情页(js),添加到购物车上(另一个后端的服务 controller)出现跨域错误,
{
商品详情web 有对应的服务 地址就是 9105 你所有的数据都是请求这个地址获取到的
购物车又是一个服务,前后台都有,服务端的地址是9107 ,购物车web只能访问9107的服务端
}
解析问题:
不能加载地址信息,(你要进行跨域请求的时候,XMLHttpRequest 对象检查头信息是否存在,"No 'Access-Control-Allow-Origin' header"是不存在的,就不允许你跨域请求的),所以在默认的情况下js是不能跨域的,为了安全性,设计成这样的。
XMLHttpRequest cannot load
http://localhost:9107/cart/addGoodsToCartList.do?itemId=112344&num=1.
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9100' is therefore not allowed access. The response had HTTP status code 400.
解决办法:
1.JSONP
2.跨域资源共享CORS(官方推荐)
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
执行流程:
前段(js)
服务端(controller)
后期的改进:
SpringMVC跨域注解
springMVC的版本在4.2或以上版本,可以使用注解实现跨域,
我们只需要在需要跨域的Controller方法上添加注解@CrossOrigin即可
@CrossOrigin(origins="http://localhost:9105",allowCredentials="true")
allowCredentials="true" 可以缺省 默认是有的 |