Весенние ошибки

#spring #cors

Вопрос:

У меня проблема с весенними корсами.

Я получаю эту ошибку в chome: Доступ к XMLHttpRequest по адресу ‘http://localhost:8080/api/informationWS» от происхождения «http://localhost:4200» заблокирован политикой CORS: на запрошенном ресурсе отсутствует заголовок «Управление доступом-Разрешить-Происхождение».

Мой файл WebSecurityConfigurerAdapter

 @EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {   
    @Autowired
    private LoginService loginService;
    
    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }   
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {   
        auth
            .userDetailsService(loginService)
            .passwordEncoder(this.passwordEncoderAutentication());
    }
    
    @Bean
    public PasswordEncoder passwordEncoderAutentication() {
        String idForEncode = "bcrypt";
        Map<String, PasswordEncoder> encoders = new HashMap<>();
        encoders.put(idForEncode, new BCryptPasswordEncoder());
        encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
        encoders.put("scrypt", new SCryptPasswordEncoder());
         
        PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
        
        return passwordEncoder;
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.cors();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}
 

Мой файл ResourceServerConfigurerAdapter

 @Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api/informationWS").permitAll()
            .antMatchers(HttpMethod.POST, "/api/work").authenticated()
            .anyRequest().denyAll();
    }  
}
 

Я попытался работать с Cors двумя приведенными ниже способами, но ни один из них не сработал, что привело к одной и той же ошибке

Мой файл cors

 @Configuration
@EnableWebMvc
public class Cors implements WebMvcConfigurer {

   @Override
    public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
            .allowedOrigins("http://localhost:4200");
    }
}
 

Мой файл Cors2

 @Configuration
public class Cors {

    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean(){
        List<String> host = Arrays.asList("http://localhost:4200");

        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedOrigins(host);
        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
        corsConfiguration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/api/**", corsConfiguration);

        CorsFilter corsFilter = new CorsFilter(source);
        FilterRegistrationBean<CorsFilter> filter = new FilterRegistrationBean<>(corsFilter);
        filter.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return filter;
    }
}
 

Ответ №1:

Что вы могли бы попробовать/проверить:

  • проверьте, выполнен ли код приложения — возможно, сервер по какой-то причине останавливает выполнение, и поэтому ваш код spring не может добавить заголовок.
  • возможно, есть предварительный запрос, и сервер не разрешает его (поэтому сервер снова остановил выполнение, и ваш внутренний код не смог отправить заголовок)
  • может быть, вы сами остановите скрипт где-нибудь перед добавлением заголовка, например System.exit(0);
  • может быть, есть перенаправление на код, который не добавляет заголовок, например, какое-то исключение
  • попробуйте запустить запрос от почтальона — вы не должны получить ошибку, и, возможно, вы увидите что-то удивительное.
  • действительно ли это .antMatchers(HttpMethod.GET, "/api/informationWS") соответствует запросу? Может быть, есть способ добавить подстановочный знак только для тестирования и посмотреть, работает ли он? Вы отправляете запрос на получение?

Более подробно, технологии разные, но концепция одна и та же: https://dariuscoder.com/2021/09/16/how-to-debug-cors/