#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/