Есть несколько ответов на эту проблему здесь, в SO. И все они сводились к настройке CORSFilter в web.xml (в приложении или на сервере). И я пытался и до сих пор пытаюсь сделать эту работу.
Вот подробности:
внешний интерфейс: приложение Angular 5, запущенное на локальном хосте: 4200
backend: приложение REST на основе cxf, работающее на Tomcat 8 со скоростью https : // localhost: 4553
Отображение фильтра CORS в web.xml:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Allow-Origin, Access-Control-Request-Headers, Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Content-Type, Authorization</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Я использую аутентификацию на основе токенов JWT с помощью AuthInterceptor в angular, который добавляет маркер Bearer в заголовок, если он присутствует, к каждому запросу.
Остальная конечная точка для аутентификации:
https://localhost:8453/onlinecounselling/service/auth
Код перехватчика:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Authorization: `${this.auth.getAccessToken().flatMap(t => `Bearer ` + t)}`
}
});
return next.handle(request);
}
Теперь, когда я отправляю этот запрос авторизации, прежде всего, запрос переходит в предполетный режим (что я не уверен, почему, я проверил MDN статью , но не сделал найти причину) и отправив запрос OPTIONS, заголовки запроса, относящиеся к этому:
Request Headers
Access-Control-Request-Headers: content-type,no-token
Метод контроля доступа-запроса: POST
Происхождение: http://localhost:4200
Пользователь-агент: Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 68.0.3440.106 Safari / 537.36
И заголовок ответа как раз такой:
Cache-Control: private
Content-Length: 0
Content-Type: text/plain
Date: Sat, 08 Sep 2018 16:02:31 GMT
Expires: Thu, 01 Jan 1970 05:30:00 IST
Нет заголовков, связанных с CORS, которые я дал в CORSFilter.
Я следовал этому ответу , статье CORSFilter сайта Tomcat, и консультировался со многими другими, но пока не нашел решения.
Я проверил у Postman, который работал нормально, и понял, что Postman не работает так же, как браузер при отправке запроса.
Дайте мне знать, если понадобятся какие-либо другие детали. Я застрял здесь последние два дня.