Access-Control-Allow-Origin与跨域

本文涉及的产品
.cn 域名,1个 12个月
简介: Access-Control-Allow-Origin与跨域

什么是跨域?

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>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

执行代付,会返回如下错误信息:


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

1

2

解决跨域问题

需要在目标页面的response中包含Access-Control-Allow-Origin这个header信息,并且它的值里有请求的域名时,浏览器才允许拿到它页面的数据进行下一步处理。如:


Access-Control-Allow-Origin: http://www.a.com

1

2

如果它的值设为 * ,则表示谁都可以用,当然这在生产环境中是不被允许的。


Access-Control-Allow-Origin: *

1

与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 {


   }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

然后在Spring配置文件中实例化此类:


<mvc:interceptor>

   <mvc:mapping path="/**"/>

   <bean class="com.test.CORSInterceptor"/>

</mvc:interceptor>

1

2

3

4

参考文章:

http://www.tuicool.com/articles/7FVnMz

http://my.oschina.net/BearCatYN/blog/509590

http://www.oicqzone.com/pc/2014083019610.html



目录
相关文章
|
1月前
|
前端开发 Java
前后端分离的跨域问题解决:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
本文介绍了解决前后端分离项目中跨域问题的方法,包括添加`CorsConfig`配置类和重写`WebMvcConfigurer`接口的`addCorsMappings`方法,允许前端请求访问后端资源,并提供了具体的代码示例。
前后端分离的跨域问题解决:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
|
JSON 前端开发 API
【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from origin ‘null‘ has been blocked by
【跨域报错解决方案】Access to XMLHttpRequest at ‘http://xxx.com/xxx‘ from origin ‘null‘ has been blocked by
3280 0
|
3月前
|
缓存 对象存储 数据安全/隐私保护
阿里云OSS, 跨域请求, No ‘Access-Control-Allow-Origin‘
阿里云OSS, 跨域请求, No ‘Access-Control-Allow-Origin‘
644 0
|
API
【已解决】No ‘Access-Control-Allow-Origin‘ header is present on the requested resource
No ‘Access-Control-Allow-Origin‘ header is present on the requested resource
380 0
【已解决】No ‘Access-Control-Allow-Origin‘ header is present on the requested resource
|
10月前
|
安全 JavaScript 前端开发
No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
|
缓存 安全 搜索推荐
Cors跨域(三):Access-Control-Allow-Origin多域名?
Cors跨域(三):Access-Control-Allow-Origin多域名?
Cors跨域(三):Access-Control-Allow-Origin多域名?
|
API
百度API调用JSONP解决跨越问题 been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header
百度API调用JSONP解决跨越问题 been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header
210 0
|
Web App开发 存储 安全
新版本Chrome同源策略、跨域问题处理No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
新版本Chrome同源策略、跨域问题处理No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
777 0
(原因:不允许有多个 ‘Access-Control-Allow-Origin‘ CORS 头)
(原因:不允许有多个 ‘Access-Control-Allow-Origin‘ CORS 头)
336 0
|
前端开发 数据可视化 Java
报错:跨域问题解决 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
报错:跨域问题解决 No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
1252 0