CORS 是解决跨域访问的一种策略,如果在 Spring boot 或者 Spring MVC 框架下使用可以说是零门槛、零难度。但是一旦项目引用了 security 后,却并不是那么容易了,不管你怎么配置,总是不生效,无法对指定的域名和源放行,也就是说,你想让你的目标域名可以使用js调用你的应用,却发现总是被 拒绝,报cors异常。
1、首先确保 spring mvc + security 可以正常运行;
2、在 spring security 的配置文件中配置必要的两个 bean,如下:
<!-- CORS 配置 -->
<bean id="corsConfigurationSource" class="org.springframework.web.cors.UrlBasedCorsConfigurationSource">
<property name="corsConfigurations">
<map>
<entry key="/**">
<bean class="org.springframework.web.cors.CorsConfiguration">
<property name="allowCredentials" value="true"/>
<property name="allowedHeaders">
<list>
<value>*</value> <!-- 允许的请求头 -->
</list>
</property>
<property name="allowedMethods">
<list>
<value>GET</value>
<value>POST</value>
<value>PUT</value>
<value>DELETE</value>
<value>OPTIONS</value> <!-- 允许的请求方法 -->
</list>
</property>
<property name="allowedOrigins">
<list>
<!-- 允许的来源 -->
<value>http://www.xxxxx.com</value>
<value>http://xxxxx.com</value>
</list>
</property>
</bean>
</entry>
</map>
</property>
</bean>
<bean id="corsFilter" class="org.springframework.web.filter.CorsFilter">
<constructor-arg ref="corsConfigurationSource"/>
</bean>
<!-- CORS 配置结束 -->
以上配置网上都有,非常简单,照抄就行了。
3、指定 corsFilter 过滤器在其他 过滤器之前执行;;
<security:http auto-config="true" use-expressions="true">
<security:cors/> <!-- 启用 cors -->
<!-- 其他配置 -->
<!-- 必须指定 corsFilter 过滤器在所有的安全过滤器之前被注入执行,否则后面关于 cors 的配置完全 失效-->
<security:custom-filter ref="corsFilter" before="CHANNEL_FILTER"/>
</security:http>
看清楚了,必须把 <security:custom-filter ref="corsFilter" before="CHANNEL_FILTER"/> 加上,否则,corsFilter 过滤器是不起作用滴!!!!!!!