您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: