1、介绍
tomcat实现cors的基础类是:org.apache.catalina.filters.CorsFilter,具体的类容请查看官网。使用tomcat实现跨域资源共享需要在web.xml文件中配置一个filter,这个filter是tomcat容器中的一个类,不需要导入任何的依赖,前提是你使用的servlet容器是tomcat。
filter的工作原理是:在HttpServletResponse中添加需要的Access-Control-*头,来实现跨域资源共享,这是符合W3C规范的,这个filter也能保护HTTP响应分裂。
具体配置如下,这是一个完整的配置:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>100</param-value>
</init-param>
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.request.decorate</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/do/*</url-pattern>
</filter-mapping>
2、初始化参数
一个没有任何的初始化参数的CorsFilter实例是没有任何意义的,所以,在初始化CorsFilter的时候,需要根据你的具体需要提供额外的初始化参数。CorsFilter一共有7个初始化参数,下面是每一个参数的作用。
cors.allowed.origins | 设置cors允许的源,可以用 * 设置所有允许所有源,也可以用一个源的集合设置白名单。源之间用逗号分隔。 |
cors.allowed.methods | 设置cors允许的方法,设置的内容会在预检的响应中作为Access-Control-Allow-Methods响应头的一部分返回。 |
cors.allowed.headers | 设置请求头,设置的内容会在预检的响应中作为Access-Control-Allow-Headers响应头的一部分返回。 |
cors.exposed.headers | 设置browser被允许访问的头,这个头信息会在预检响应中作为Access-Control-Expose-Headers响应头的一部分被返回。 |
cors.preflight.maxage | 设置允许browser缓存预检请求结果的秒钟数,该值会在预检响应中作为Access-Control-Max-Age响应头的一部分被返回。 |
cors.support.credentials | 设置是否支持用户认证,该值会在预检响应头中作为Access-Control-Allow-Credentials响应头的一部分被返回,以帮助browser确定一个请求是否能够被用于用户认证。 |
cors.request.decorate | 设置以上的所有属性是否能够被添加到请求头中。 |