Запросы из углового приложения заблокированы политикой CORS в весеннем приложении - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь отправить запрос от углового интерфейса к контроллеру REST, предоставляемому Spring backend.Контроллер REST имеет @CrossOrigin аннотацию.

Я использую HttpClient для отправки запросов из углового приложения.

Запрос:

  const httpOptions = {
      headers: new HttpHeaders({
        'Authorization': 'Basic ' + basicAuthHeader,
      })
    };
    return this.http.get(this.address + this.addressStorage.loginEndpoint + '/' + playerName, httpOptions);

Результат:

Access to XMLHttpRequest at 'xxx' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

Тот же запрос, отправленный почтальоном, дает правильный ответ.

Мое предположение:

Я проверил сетьвкладка с использованием инструментов разработчика Chrome: screen of network tab

Проблема вызвана тем, что запрос OPTIONS отправляется вместо запроса GET, а CORS разрешает только метод GET?

Если предположить, что мои предположения верны, то добавление этого компонента в приложение весенней загрузки решит мою проблему?

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    } 

К сожалению, в настоящее время я не могу изменить реализацию бэкэнда, поэтому не могу найти его самостоятельно.

Дополнительная информация:

  registerPlayer(player: PlayerDTO): Observable<Object> {
    const httpOptions = {
      headers: new HttpHeaders({'Content-Type': 'application/json'}),
    };
    return this.http.post(this.address + this.addressStorage.createUserEndpoint, player, httpOptions);
  }

Этот запрос, отправленный тому же контроллеру, но на другой конечной точке, возвращает правильные ответы.

1 Ответ

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

Я полагаю, что ваш сервер отправляет Access-Control-Allow-Credentials означает, что в угловом формате вы также должны сообщить службе для отправки запроса с 'Access-Control-Allow-Credentials': 'true'

Обновление

Учетные запросы и символы подстановки При ответедля запроса с полномочиями сервер должен указать источник в значении заголовка Access-Control-Allow-Origin вместо указания подстановочного знака «*». Предварительно просвеченные запросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...