Угловая попытка недопустимого метода OPTIONS 405 при перенаправлении на внешний вход
У меня есть приложение Spring Boot 2 - Angular5 с внешним сервисом входа в систему CAS. Когда сеанс истекает, а внешний интерфейс Angular пытается выполнить запрос к бэкэнду Srping Boot, Spring Boot вызывает перенаправление на внешний вход, но вместо перенаправления я получаю дважды:
OPTIONS https://myCasServer/cas/login?service=myCasUrlEntryPoint 405 (Method Not Allowed)
А потом:
Access to XMLHttpRequest at 'https://myCasServer/cas/login?service=myCasUrlEntryPoint'
(redirected from 'myCasUrlEntryPoint/api/myCall') from origin 'myCasUrlEntryPoint' has been
blocked by CORS policy: Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Исходя из этого, я понимаю, что Angular пытается вызвать сервер CAS с глаголом OPTIONS, который, кажется, не поддерживается, поэтому возникает ошибка, которая, конечно, не проходит политику CORS.
Я особенно заинтригован по поводу OPTIONS, потому что я думал, что вызов get (что и было первоначальным запросом) не запрашивал OPTIONS.
Более того, у меня есть сборка перехватчика Http в приложении, которая хорошо работает для всех других ошибок HTTP, которые я пробовал, но, похоже, не сможет отловить это 405.
И, наконец, есть идеи, как это исправить? (Я могу предоставить некоторый код для ясности, если это необходимо)
Update1: это код, выполняющий запрос:
// Those are injected by Angular
http: HttpClient;
location: Location;
let params = new HttpParams();
params = params.append("rcn", String(pDocument.rcn));
params = params.append("content_type", pDocument.content_type);
return this.http.get<any>(this.location.prepareExternalUrl(Constants.BASE_ROUTE + '/getDocument'), {params});
Обновление 2: я также делюсь соответствующей частью перехватчика Http (журнал консоли для перенаправления 405 никогда не появляется):
@Injectable()
export class RequestErrorInterceptor implements HttpInterceptor
{
constructor(private uxService: UxService, private http: HttpClient, private location: Location)
{}
/**
* Intercepting Http requests and taking different actions with status code * @param {HttpRequest<any>} req
* @returns {Observable<HttpEvent<any>>}
* @param pHttpRequest
* @param pHttpHandler
*/
intercept(pHttpRequest: HttpRequest<any>, pHttpHandler: HttpHandler): Observable<HttpEvent<any>>
{
return pHttpHandler.handle(pHttpRequest)
.do( () => {},
(pError: any) => {
if (pError instanceof HttpErrorResponse)
{
switch (pError.status)
{
case 404:
{
this.showNotificationError(pError, 'warning');
break;
}
case 401:
case 403:
case 405:
{
this.redirectToLogin();
break;
}
default:
{
this.showNotificationError(pError, 'danger');
break;
}
}
}
});
}
private redirectToLogin()
{
console.log("TRYING REDIRECT");
return this.http.get<any>(this.location.prepareExternalUrl('/api/redirectToLogin'));
}
Обновление 3: Пример заголовка запроса для GET
GET /myAppUrl/api/myCall HTTP/1.1
Host: myAppUrl
Connection: keep-alive
Accept: application/json, text/plain, */*
Cache-Control: No-Cache
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Referer: myAppUrl
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Cookie: JSESSIONID=something; WT_FPC=id=othersomething
Обновление 4: Пример заголовка запроса для опций:
OPTIONS /cas/login?service=myCasUrlEntryPoint HTTP/1.1
Host: myCasServer
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: myAppUrl
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Access-Control-Request-Headers: cache-control,x-requested-with
Accept: */*
Referer: myAppUrl/someView
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9