У меня есть реализация CORS в моем проекте Spring Boot, который я хотел знать, это правильный путь? - PullRequest
0 голосов
/ 22 мая 2018
@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 голосов
/ 22 мая 2018

Я думаю, что подход в порядке.Особенность аннотаций состоит в том, что они статичны по своей природе во время компиляции - но это может отлично работать в вашем случае использования.

Как и во многих вещах в Spring, существует более одного действительного способа сделать это.То, что «лучше», будет зависеть от вашей ситуации и требований.Если у вас есть статическая четко определенная политика 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());
    }

} 

Это не значит, что это обязательно лучший способ, но он работает для меня и достаточно гибок.

IПредлагаю вам также ознакомиться с образцом весенней загрузки: https://spring.io/guides/gs/rest-service-cors/, который показывает другой шаблон с использованием адаптера веб-конфигуратора:

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