我在Spring Boot项目中有一个CORS实现我想知道这是正确的方法吗?

时间:2018-05-22 08:30:46

标签: spring spring-boot spring-security cors

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {



@Override
protected void configure(final HttpSecurity https) throws Exception {


    https.headers().disable();
    https.csrf().disable();

    https.headers().cacheControl();
    https.cors().configurationSource(new CorsConfigurationSource() {
        @Override
        public CorsConfiguration getCorsConfiguration(final HttpServletRequest request) {
            return new CorsConfiguration().applyPermitDefaultValues();
        }
    });

  }
}

我尝试了以上配置并且工作正常 而且我也相信Spring在控制器级别有@CrossOrigin注释:所以在实现方面最优选

1 个答案:

答案 0 :(得分:1)

我认为这种方法很好。基于注释的东西是它们在编译时是静态的 - 但这可能在你的用例中完美地工作。

与春天的许多事情一样,有多种有效的方法可以做事,而且最好是"最好的"将取决于您的情况和要求。如果你有一个静态定义良好的CORS策略,那么基于注释可能是对你的代码库最简单和最少侵入的。

如果您需要稍微动态或灵活的东西 - 可能基于运行时的属性设置。在我的最新项目中,我处理CORS的方式是这样的:

@Configuration
@EnableWebSecurity
@Slf4j
@EnableConfigurationProperties({CORSProperties.class})
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CORSProperties properties;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        log.info("Configuring web security....");
        http.headers()
                .and()
                .cors();
    }

    @Bean
    public UrlBasedCorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(properties.getAllowedOrigins());
        configuration.setAllowedMethods(allHttpMethods());
        configuration.setAllowedHeaders(asList(CrossDomainCsrfTokenRepository.XSRF_HEADER_NAME, CONTENT_TYPE));
        configuration.setExposedHeaders(asList(LOCATION, CrossDomainCsrfTokenRepository.XSRF_HEADER_NAME));
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(HOURS.toSeconds(properties.getMaxAgeInHours()));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    private List<String> allHttpMethods() {
        return Stream.of(HttpMethod.values())
                .map(HttpMethod::name)
                .collect(toList());
    }

} 

这并不是说这一定是最好的方式,但它对我有用并且足够灵活。

我建议你也检查一下spring boot示例:https://spring.io/guides/gs/rest-service-cors/,它使用web配置适配器显示另一种模式:

 @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }