Реализация Spring Rest с поддержкой CORS — проблема с несколькими запросами (ответ на предварительный запрос не проходит проверку контроля доступа)

У меня возникают проблемы с поддержкой CORS для реализации Spring Rest. Странно то, что я могу успешно войти в систему с помощью Rest API, но после входа в систему получаю исключение как-

Ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:8100' запрещен. В ответе был код состояния HTTP 401.

Фрагмент кода, который я использую, выглядит следующим образом:

Класс конфигурации -

  @Bean
  public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new CorsInterceptor());
    }
   };
 }

Класс CorsInterceptor -

public class CorsInterceptor extends HandlerInterceptorAdapter {

 public static final String CREDENTIALS_NAME = "Access-Control-Allow-Credentials";
 public static final String ORIGIN_NAME = "Access-Control-Allow-Origin";
 public static final String METHODS_NAME = "Access-Control-Allow-Methods";
 public static final String HEADERS_NAME = "Access-Control-Allow-Headers";
 public static final String MAX_AGE_NAME = "Access-Control-Max-Age";

 static final String ORIGIN = "Origin";

 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  String origin = request.getHeader(ORIGIN);
  response.addHeader(ORIGIN_NAME, origin);
  response.setHeader(CREDENTIALS_NAME, "true");
  response.setHeader(METHODS_NAME, "GET, POST, PUT, OPTIONS, DELETE");
  response.setHeader(HEADERS_NAME,
        "Authorization, Accept-Encoding,Cache-Control, Connection, Content-Length, Cookie,Host, If-Modified-Since, Pragma, User-Agent,Content-Type");
  response.setHeader(MAX_AGE_NAME, "3600");

  if (request.getMethod().equals("OPTIONS")) {
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
  }

  return true;
}

Здесь я могу успешно войти в систему (сначала предварительный запрос, затем фактический запрос, оба работают нормально). После этого я вызываю POST-запрос (вызывается первый предварительный запрос), но он дает мне исключения:

Ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:8100' запрещен. В ответе был код состояния HTTP 401.

Я пробовал использовать CorsConfiguration, а также CorsRegistry как -

registry.addMapping("/**").allowedOrigins("*")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("")
            .allowCredentials(true).maxAge(3600);

Но не повезло.

Дайте мне знать, если я что-то пропустил здесь.

Спасибо.


person Bhushan    schedule 14.03.2016    source источник


Ответы (1)


Вы должны использовать фильтр вместо перехватчика и попытаться изменить response.addHeader(ORIGIN_NAME, origin); на response.addHeader(ORIGIN_NAME, "*");

person Michael Desigaud    schedule 15.03.2016
comment
Я тоже пробовал это, но не повезло. Выдает такое же сообщение об ошибке. Первый вызов API для входа выполняется успешно с помощью методов, которые я пробовал ранее, но после этого я получаю то же сообщение об ошибке, что и в моем вопросе выше. - person Bhushan; 15.03.2016