Аннотация CrossOrigin не работает в весенней загрузке - PullRequest
1 голос
/ 29 апреля 2019

У меня есть приложение Spring Boot, которое предоставляет некоторые конечные точки. Из приложения React я хочу делать запросы к этим конечным точкам, но он продолжает вызывать у меня проблему CORS:

доступ к XMLHttpRequest по адресу 'Локальный: 9090 / Гелиос-администратор / апи / приборная панель / клиенты страница = 0 & размер = 30' из источника 'http://localhost:3000' заблокирован политикой CORS: Запросы перекрестного происхождения поддерживаются только для схем протоколов: http, data, chrome, chrome-extension, https.

Итак, я попытался использовать аннотацию @CrossOrigin для всех моих методов, а также для класса Controller, но ошибка та же.
Запрос на получение в моем приложении реакции выглядит следующим образом:

constructor() {
        this.url = 'localhost:9090/helios-admin/api/dashboard/clients?page=0&size=30';
    }

    getProjectStatusById(projectId) {
        Axios.get(this.url).then(res=>{
            console.log(res.data);
        })
    }

Чего не хватает?

EDIT В моем весеннем загрузочном приложении у меня есть только этот класс для настройки безопасности:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {



    @Autowired
    SysdataUserDetailsService sysdataUserDetailsService;



    @Autowired
    private JwtAuthEntryPoint jwtAuthEntryPoint;



    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(sysdataUserDetailsService)
                .passwordEncoder(encoder());
    }



    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
                .antMatchers(PathConstants.USER_AUTH +"/**", PathConstants.HELIOS+"/dashboard/**").permitAll()
                .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll()
                .antMatchers(HttpMethod.POST, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll()
                .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_INSTANCE+"/**").permitAll()
                //.anyRequest().authenticated()
                .anyRequest().permitAll()
                .and()
                .exceptionHandling().authenticationEntryPoint(jwtAuthEntryPoint).and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // custom jwt filter.
        http.addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Вы можете добавить его, переопределив addCorsMappings из WebMvcConfigurerAdapter, поэтому либо создайте класс, который расширяет WebMvcConfigurerAdapter, либо определите bean-компонент в вашем классе конфигурации следующим образом:

    @Bean
    public WebMvcConfigurer corsConfigurer () {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("http://domain1.com", "http://domain2.com")
                        .allowedMethods("GET", "OPTIONS")
                        .allowedHeaders("header1", "header2", "header3")
                        .exposedHeaders("header1", "header2")
                        .allowCredentials(false).maxAge(3600);
            }
        }
    }

Редактировать

Начиная с версии 5.0 WebMvcConfigurerAdapter устарела, и, следовательно, вы можете достичь того же самого, реализовав интерфейс WebMvcConfigurer (добавлены методы по умолчанию, спасибо java 8! И могут быть реализованы напрямую без использования этого адаптера)

@Configuration
@EnableWebMvc
public class MyWebMvcConfig implements WebMvcConfigurer {

   @Override
   public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                    .allowedOrigins("http://domain1.com", "http://domain2.com")
                    .allowedMethods("GET", "OPTIONS")
                    .allowedHeaders("header1", "header2", "header3")
                    .exposedHeaders("header1", "header2")
                    .allowCredentials(false).maxAge(3600);
   }

}

1 голос
/ 29 апреля 2019

Вы можете создать отдельный класс конфигурации CORS следующим образом.Этот класс будет обрабатывать конфигурации CORS для всех запросов в вашем приложении, и вам не нужно аннотировать каждый контроллер отдельно @CrossOrigin.

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");         //'*' allows all endpoints, Provide your URL/endpoint, if any.
        config.addAllowedHeader("*");         
        config.addAllowedMethod("POST");   //add the methods you want to allow like 'GET', 'PUT',etc. using similar statements.
        config.addAllowedMethod("GET");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}
0 голосов
/ 17 мая 2019

Вы можете добавить глобальную конфигурацию, такую ​​как

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

Просто используйте это, чтобы добавить глобальную конфигурацию corrs, которая повлияет на все конечные точки. Попробуйте, если аннотация не работает.

...