跨域请求的问题追踪
跨域请求首先要理解几个概念:
同源:协议,域名,IP,端口全部相同。只要有一个不同就是跨域。
浏览器为了保护请求的安全性,采用同源协议。如果没有得到目标服务器的授权许可,非同源条件下不能获取到目标服务器的资源。
如果不遵守同源协议会发生什么呢?
加入你访问了淘宝支付页面,本地有你的cookie,这是你有点开了自己精心收藏的岛国小电影的网页,
不巧的是,这个网页上在你看不到的地方有ajax请求,它可以获取到你的cookie,然后这个恶意网站拿着你的cookie信息
又访问了你的淘宝支付页面,这样就在你放飞自我的时候,你的银行卡的钱就悄悄的不见。
上面说的这种是xmlhttprequest同源策略要解决的问题。
还有一种情况,你打开了一个假网站,这个网站比如叫”某东“,除了域名和“正版东”稍有区别,不仔细观察完全无法发现以外,
其他的几乎一样。当你在在表单中填入自己的账号和密码以后,表单数据通过跨域请求到”正版东“网站,于是就行成了一次信息泄露。
这种情况是DOM同源策略要解决的问题。
正式因为有同源策略,所以ajax和http才无法进行跨域。
那么不跨域不就可以了吗?
事实上,分布式项目各个子域名之间的访问时避不开这个问题的。虽然盗贼进不来了,但是客人也来不了。
要实现各级子域名之间的正常访问,必须解决跨域访问问题。
1.JSONP
前端通过ajax进行跨域请求,浏览器一律不准,但是js是个例外,凡是拥有src这个属性的都有跨域的能力。
所以把数据包装进js就可以进行跨域访问。js对json这个数据格式原生支持,并且传递时会将callback作为一个
参数传过去。服务器在接受到这个请求时,会先判断这个请求带不带callback,如果带着这个参数,
会把json数据在包装进callback中返回给前端。这就是jsonp的实现模式。
但是jsonp的缺点明显:
它只支持get请求
它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
2.代理服务器
前边说跨域问题时浏览器为了遵守同源策略保证请求的安全性。如果不使用浏览器直接通过代理服务器访问就不会有跨域问题的存在。
浏览器也并不是把这种访问在请求时进行了阻止,而是已经访问到了,但是返回的信息被浏览器拦截了。
3.springmvc后台处理
如果mvc的版本时4.2及以上,使用注解@CrossOrigin(origins ="xxx")对允许访问的域名进行开放
4.后台服务请求头设置跨域数据共享:
Access-Control-Allow-Origin

浙公网安备 33010602011771号