spring boot 过滤器实现跨域控制
application.properties
spring.mvc.dispatch-options-request=true
spring.mvc.dispatch-options-request是一个Spring Boot属性,它控制是否在接收到HTTP OPTIONS请求时,将该请求转发到Spring MVC的DispatcherServlet来处理。
默认情况下,spring.mvc.dispatch-options-request属性的值为false,这意味着Spring Boot应用程序会自动处理HTTP OPTIONS请求并返回适当的响应,而不会将请求转发到DispatcherServlet来处理。这通常用于处理CORS(跨域资源共享)的预检请求。
如果将spring.mvc.dispatch-options-request属性设置为true,则Spring Boot应用程序将把HTTP OPTIONS请求转发到DispatcherServlet来处理。在这种情况下,你需要确保在你的应用程序中有一个适当的@RequestMapping或@CrossOrigin注解,以处理该请求并返回适当的响应。
总的来说,spring.mvc.dispatch-options-request属性可以帮助你控制Spring Boot应用程序对HTTP OPTIONS请求的处理方式,具体取决于你的应用程序需要的处理方式。
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean corsFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean(new MyCorsFilter());
registration.addUrlPatterns("/*");
registration.setOrder(0);
return registration;
}
}
public class MyCorsFilter extends CorsFilter {
public MyCorsFilter() {
super(configurationSource());
}
private static CorsConfigurationSource configurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("*"));//域名控制 * 的代表不限制
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
configuration.setAllowedHeaders(Collections.singletonList("*"));
configuration.setMaxAge(3600L);
//的意思是将 CorsConfiguration 对象 configuration 注册到 source 对象中,并设置其适用于所有的 URL 路径。在 Spring 中,
// CorsConfiguration 是一个表示 CORS 配置的对象,可以通过 CorsConfiguration 对象来配置跨域请求的许可范围、请求头、请求方法等信息。
// "/**" 表示所有的 URL 路径都适用于该 CorsConfiguration 对象,即所有的请求都可以使用该 CorsConfiguration 配置。这意味着,
// 对于当前应用的所有请求都会受到这个配置的影响,从而允许跨域请求。在实际开发中,
// 可以根据实际情况来设置 CorsConfiguration 对象的适用范围,以实现更灵活的跨域控制。
source.registerCorsConfiguration("/**", configuration);
return source;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Credentials", "true");
super.doFilterInternal(request, response, filterChain);
}
}