JAVA WEB支持CORS 跨域访问

作者:Rui 发布时间:July 10, 2015 分类:WEB,JAVA 浏览:1,200

平时在web项目开发中会经常遇到一些跨域操作,但由于由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),会造成Origin null is not allowed by Access-Control-Allow-Origin”错误。目前经常用于跨域操作的两个解决方案: JSONP和CORS(Cross Origin Resource Sharing )

问题原因

这是由于浏览器的同源策略限制的缘故,简单来说,从HTML中发出XMLHttpRequest 请求时,Browser会做检查,如果发现Response中没有Access-Control-Allow-Origin Header或Access-Control-Allow-Origin Header Header的值与 HTML的 orgin 不同时,Browser会拒接绝该Response,Javascript就收不到该Response。 本地HTML的Origin是 null, 而Server端没有发出Access-Control-Allow-Origin Header Header给Browser, 所以会有了“Origin null is not allowed by Access-Control-Allow-Origin”错误。

JSONP和CORS比较

  • JSONP 只能用于GET请求,并且有一定的安全隐患,因为JSONP的实现机制实际上类似于注入脚本
  • CORS Cross Origin Resource Sharing (CORS) W3C标准,专门用来解决跨域问题。支持各种形式的请求。由于这是比较新的标准,旧的浏览器会不支持。

CORS 原理

CORS 定义了一套Access-Control Header控制的标准, 定义以下头部信息,来控制是否允许跨域访问,什么样的请求能够跨域

Access-Control-Allow-Origin Response Header
Access-Control-Allow-Credentials Response Header
Access-Control-Expose-Headers Response Header
Access-Control-Max-Age Response Header
Access-Control-Allow-Methods Response Header
Access-Control-Allow-Headers Response Header
Access-Control-Request-Method Request Header
Access-Control-Request-Headers Request Header

CORS 浏览器支持

QQ图片20160224130720.png

目前主流的浏览器大多都支持CORS,旧版的 IE7不支持。

Tomcat 下配置 CORS

Apache Tomcat 从7.0 版本之后才支持CORS,以下配置示例

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

详细的配置参数请参见: http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter

相关文档:
http://enable-cors.org/
https://www.w3.org/TR/cors/

标签: none

添加新评论 »