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);
    }
}