Web CORS 跨域方式使用方式

CORS 参考

http://enable-cors.org/index.html https://help.aliyun.com/document_detail/oss/practice/cors_guide.htmlhtml

同源策略

跨域访问,或者说JavaScript的跨域访问问题,是浏览器出于安全考虑而设置的一个限制,即同源策略。当来自于A网站的页面中的JavaScript代码但愿访问B网站的时候,浏览器会拒绝该访问,由于A,B两个网站是属于不一样的域。 web

在实际应用中,常常会有跨域访问的需求,好比用户的网站www.a.com,后端使用了OSS。在网页中提供了使用JavaScript实现的上传功能,可是在该页面中,只能向www.a.com发送请求,向其余网站发送的请求都会被浏览器拒绝。这样就致使用户上传的数据必须从www.a.com中转。若是设置了跨域访问的话,用户就能够直接上传到OSS而无需从www.a.com中转。后端

CORS介绍

跨域资源共享(Cross-Origin Resource Sharing),简称CORS,是HTML5提供的标准跨域解决方案,具体的CORS规则能够参考W3C CORS规范。跨域

CORS是一个由浏览器共同遵循的一套控制策略,经过HTTP的Header来进行交互。浏览器在识别到发起的请求是跨域请求的时候,会将Origin的Header加入HTTP请求发送给服务器,好比上面那个例子,Origin的Header就是www.a.com。服务器端接收到这个请求以后,会根据必定的规则判断是否容许该来源域的请求,若是容许的话,服务器在返回的响应中会附带上Access-Control-Allow-Origin这个Header,内容为www.a.com来表示容许该次跨域访问。若是服务器容许全部的跨域请求的话,将Access-Control-Allow-Origin的Header设置为*便可,浏览器根据是否返回了对应的Header来决定该跨域请求是否成功,若是没有附加对应的Header,浏览器将会拦截该请求。浏览器

以上描述的仅仅是简单状况,CORS规范将请求分为两种类型,一种是简单请求,另一种是带预检的请求。预检机制是一种保护机制,防止资源被原本没有权限的请求修改。浏览器会在发送实际请求以前先发送一个OPTIONS的HTTP请求来判断服务器是否能接受该跨域请求。若是不能接受的话,浏览器会直接阻止接下来实际请求的发生。缓存

只有同时知足如下两个条件才不须要发送预检请求:安全

请求方法是以下之一:服务器

GET
HEAD
POST
全部的Header都在以下列表中:app

Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma
预检请求会附带一些关于接下来的请求的信息给服务器,主要有如下几种:cors

Origin:请求的源域信息
Access-Control-Request-Method:接下来的请求类型,如POST、GET等。
Access-Control-Request-Headers:接下来的请求中包含的用户显式设置的Header列表。
服务器端收到请求以后,会根据附带的信息来判断是否容许该跨域请求,信息返回一样是经过Header完成的:

Access-Control-Allow-Origin:容许跨域的Origin列表
Access-Control-Allow-Methods:容许跨域的方法列表
Access-Control-Allow-Headers:容许跨域的Header列表
Access-Control-Expose-Headers:容许暴露给JavaScript代码的Header列表。
Access-Control-Max-Age:最大的浏览器缓存时间,单位s。
浏览器会根据以上的返回信息综合判断是否继续发送实际请求。固然,若是没有这些Header浏览器会直接阻止接下来的请求。

这里须要再次强调的一点是,以上行为都是浏览器自动完成的,用户无需关注这些细节。若是服务器配置正确,那么和正常非跨域请求是同样的。

 

 Java Web服务器配置

maven依赖

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

web.xml加入配置

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportedHeaders</param-name>
        <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposedHeaders</param-name>
        <param-value>Set-Cookie</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>cors.maxAge</param-name>
        <param-value>3600</param-value>
    </init-param>
</filter>

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

其余跨域方案

document.domain方案,前提是必须是同一个基域名

iframe

相关文章
相关标签/搜索