Простая настройка CORS не работает, принимая все средства - PullRequest
0 голосов
/ 01 ноября 2019

Внешний сервер работает на локальном хосте: 8080 и пытается выполнить запрос CORS PUT на загрузочный сервер Spring, работающий на локальном хосте: 1072

Я нашел все возможные решения, чтобы запрос CORS работал.

Однако он работает только с помощью Postman для запроса PUT.

Получил 401 в браузере Chrome.

Как заставить сервер Spring принимать запросы CORS.

Спасибо!

Также любопытно, почему Spring не показывает исключение на консоли и всегда дает разработчикам трудное время lol

CORSConfig.java

@Configuration
public class CORSConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://localhost:8080");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        registry.addMapping("/**")
                .allowedMethods("*").allowedOrigins("*");
    }
}

WebSecurityConfig.java

@Override
protected void configure(HttpSecurity http) throws Exception {

    if (h2ConsoleEnabled)
        http.authorizeRequests()
            .antMatchers("/h2-console", "/h2-console/**").permitAll()
            .and()
            .headers().frameOptions().sameOrigin();

    http.csrf().disable()
        .cors()
        .and()
        .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
        .and()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
        .authorizeRequests()
        .antMatchers(HttpMethod.GET, "/v1/**","/articles/**", "/profiles/**", "/tags").permitAll()
            .antMatchers(HttpMethod.PUT, "/v1/**","/articles/**", "/profiles/**", "/tags").permitAll()
            .antMatchers(HttpMethod.POST, "/v1/**","/articles/**", "/profiles/**", "/tags").permitAll()
        .anyRequest().authenticated();

    http.addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}

@Bean
public CorsConfigurationSource corsConfigurationSource() {
    final CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.addAllowedOrigin("*");
    configuration.addAllowedHeader("*");
    configuration.addAllowedMethod("*");
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

}

ArticleApi.java

  @CrossOrigin(origins = "*")
  @RestController
  @RequestMapping(path = "/v1/groups/{groupId}/articles/{aId}")
  public class ArticleApi {


      @CrossOrigin(origins = "*")
      @PutMapping
      public String updateArticle(@PathVariable("groupId") String groupId,
                                  @PathVariable("aId") String aId
                                  ) {
          return 
      }

1 Ответ

1 голос
/ 01 ноября 2019

Ответ 401 получен, когда проверка перед полетом для запроса CORS не удалась. Таким образом, может случиться так, что ваши cors настроены неправильно. При чтении вашей конфигурации были сделаны следующие наблюдения:

  • Если вы собираетесь разрешить запросы с перекрестными источниками из всех доменов во всех методах, выможет удалить аннотацию уровня метода контроллера @CrossOrigin(origins = "*"), как это уже указано на уровне класса.
  • Вы предоставляете две глобальные конфигурации для конфигурации CORS. Одна конфигурация с порядком бинов, установленным в 0, принимает только происхождение http://localhost:8080, в то время как конфигурация с пружинной безопасностью принимает все источники. Удалите одну и сохраните любую из двух в соответствии с вашими потребностями.

Вы можете попробоватьудаление конфигурации CORS, предоставленной в классе CORSConfig. Вы уже предоставили конфигурацию cors вместе с WebSecurityConfig. Вы можете удалить конфигурацию cors, представленную в конфигурации безопасности, в любом случае, она будет работать только с одной конфигурацией или попытаться удалить приведенный ниже код:

@Configuration
public class CORSConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://localhost:8080");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        registry.addMapping("/**")
                .allowedMethods("*").allowedOrigins("*");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...