Я пытаюсь отправить запрос от углового интерфейса к контроллеру 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:
Проблема вызвана тем, что запрос 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);
}
Этот запрос, отправленный тому же контроллеру, но на другой конечной точке, возвращает правильные ответы.