Угловая попытка недопустимого метода 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

0 ответов

Другие вопросы по тегам