跨域请求解决方法(JSONP, CORS)

1、跨域

假设我们页面或者应用部署在 http://www.aaa.com 上了,而我们打算从 http://www.bbb.com 请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误,"跨域"也就以此由来。
 
这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),项目开发不可避免的需要进行跨域操作,它是前端工程师的基本功之一。
 
大多数跨域的解决方案一样都是JSONP,但是它只支持GET。如果需要改成支持POST,因为传输的数据量比较大,GET形式搞不定。这就需要CORS(跨域资源共享,Cross-Origin Resource Sharing
 
2、jsonp:就是将返回的json数据放到一个回调方法里,只支持GET
 
客户端:get是后面加上www.bbb.com/11?callback=xxx
 
服务端:返回的数据:jsonpcallback({"Email":"zhww@outlook.com","Remark":"我来自遥远的东方"})就是合法的js语句
 
3、cors:
 
客户端:需要发送请求的浏览器支持cors,代码:
 
var data = {name:"a",password:"bb",email:"cc@cc.cc",birthday:"1980-01-23"};

 $.ajax({
   url: 'http://127.0.0.1:8080/RestEasy_04/User',
   type: 'POST',
   contentType : 'application/json',
   dataType: "json",
   data: JSON.stringify(data),
   success: function(){
     console.log(arguments);
   },
   error: function(){
     console.log('error')
   }
 });
 
服务端:返回的时添加头 Access-Control-Allow-Origin
 
为了防止XSS攻击我们的服务器,也可以设置指定的域名,如只允许来自域名 http://www.aaa.com 的请求:
 
Access-Control-Allow-Origin: http://www.aaa.com
 
4、java的cors解决方法:CORS Filter

使用Maven添加cors-filter,pom.xml

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.1.2</version>
</dependency>

使用

web.xml添加过滤器:

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>

为单独的servlet应用过滤如下:

<filter-mapping>
        <filter-name>CORS</filter-name>
        <servlet-name>MyServlet</servlet-name>
</filter-mapping>

为指定路径应用过滤如下:

<filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

另附下载地址:http://software.dzhuvinov.com/cors-filter.html

使用方法:http://software.dzhuvinov.com/cors-filter-installation.html 

 

posted on 2014-10-21 12:04  lxsky  阅读(1013)  评论(0编辑  收藏  举报

导航