Access-Control-Allow-Origin与跨域
2016-02-19 11:34
519 查看
什么是跨域?
JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。在某域名下使用Ajax向另一个域名下的页面请求数据,会遇到跨域问题。怎样才能算跨域?协议,域名,端口都必须相同,才算在同一个域。通常来说,跨域分为以下几类:url | 说明 | 是否允许通讯 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js | 同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js | 同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://170.32.82.74/b.js | 域名和域名对应ip | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js | 同一域名,不同二级域名 | 不允许 |
http://www.a.com/a.js http://a.com/b.js | 二级域名和一级域名 | 不允许(cookie这种情况下也不允许访问) |
http://www.b.com/a.js http://www.a.com/b.js | 不同域名 | 不允许 |
跨域例子
此例子存在跨域问题,如需测试,修改地址即可。<html> <head> <title>title</title> <script src="http://code.jquery.com/jquery-1.7.1.min.js"/> <script> $.ajax({ url:"http://map.oicqzone.com/gpsApi.php?lat=22.502412986242&lng=113.93832783228", type:'GET', success: function(data){ $('body').append( "Name: " + data ); } }); </script> </head> <body> 测试Ajax跨域问题 </body> </html>
执行代付,会返回如下错误信息:
XMLHttpRequest cannot load http://map.oicqzone.com/gpsApi.php?lat=22.502412986242&lng=113.93832783228. Origin http://localhost is not allowed by Access-Control-Allow-Origin. AJAX
解决跨域问题
需要在目标页面的response中包含Access-Control-Allow-Origin这个header信息,并且它的值里有请求的域名时,浏览器才允许拿到它页面的数据进行下一步处理。如:Access-Control-Allow-Origin: http://www.a.com
如果它的值设为 * ,则表示谁都可以用,当然这在生产环境中是不被允许的。
Access-Control-Allow-Origin: *
与Spring集成使用
新建CORSInterceptor类,实现HandlerInterceptor接口,并重写preHandle方法,在此方法中为Header添加此信息:public class CORSInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.addHeader("Access-Control-Allow-Origin", "http://www.a.com"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
然后在Spring配置文件中实例化此类:
<mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.test.CORSInterceptor"/> </mvc:interceptor>
参考文章:
http://www.tuicool.com/articles/7FVnMz
http://my.oschina.net/BearCatYN/blog/509590
http://www.oicqzone.com/pc/2014083019610.html
相关文章推荐
- Python oracle ImportError: DLL load failed: 找不到指定的程序 or dll load failed 不是有效的 win32 应用程序。
- 移动端资源集锦
- Access-Control-Allow-Origin与跨域
- 根据GridView itme的个数来确定当前的GridView 的高度
- linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)
- SSO之CAS单点登录详细搭建教程
- [转] sql_id VS hash_value
- 使用官方isal工具提取DSDT
- phpunit安装
- 解决VS中function unsafe的问题
- static静态代码块与非静态代码块 + 构造函数
- 在Windows下安装pinpoint并关联自己的服务(tomcat)
- [经典]Linux内核中ioremap映射的透彻理解
- JavaScript深度复制(deep clone)的实现方法
- 理想互联网金融p2p平台特性
- 远程桌面,RDP文件密码加密、解密算法(C#)
- mysql之加锁处理分析
- 目录
- 二元高度
- 正则表达式总结