Angular, HTTP Get работает, Post получает ошибку CORS - PullRequest
0 голосов
/ 10 июля 2019

Настройка

У меня есть приложение Angular, работающее в iframe в приложении JSP.Приложение JSP является устаревшим и должно остаться.И JSP, и Angular вызывают одни и те же службы REST.Приложение JSP выполняет вход в систему и получает файл cookie сеанса.Поскольку приложение Angular встроено в приложение JSP на том же сервере Tomcat, куки передаются (по крайней мере, как я понимаю).

tomcat
├── webapps
│   ├── jspapp
│   │   ├── ...
│   ├── angularapp
│   │   ├── ...

GET Code

... build params ...
return http.get(url,
  { params: params }).pipe(
    map(
      (response: Response) => {
        ... handle response ...
        return data;
      },
      (error: any) => {
        console.log(error);
      }
    )
  );

Заголовок GET

GET http://severname:8080/jsprest/url/to/rest/service?param=value HTTP/1.1
Host: severname:8080
Connection: keep-alive
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Referer: http://severname:8080/angular/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: JSESSIONID=UNIQUEID; xcp-locale=en_US; x-csrf-token=SOMETOKEN

Код POST

... build body ...
return http.post(url, body, 
  { headers: { 'Accept': ['application/json', 'text/plain', '*/*'], 'Content-Type': 'application/json' } });

Заголовок POST

POST  http://severname:8080/jsprest/url/to/rest/service HTTP/1.1
Host: severname:8080
Connection: keep-alive
Content-Length: 158
Accept: application/json,text/plain,*/*
Origin: http://severname:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Content-Type: application/json
Referer: http://severname:8080/angular/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: JSESSIONID=UNIQUEID; xcp-locale=en_US; x-csrf-token=SOMETOKEN

{"body":"data","foo":"bar"}

Ошибка

В консоли браузера Я получаю следующую ошибку

403: Доступ к указанному ресурсу имеетбыла запрещена ошибка.

В Tomcat Я получаю следующую ошибку,

CSRF-токен в заголовках cookie / запроса пуст или значения не совпадают

Вопрос

Я убедился, что токены jessionid и csrf идентичны между GET и POST.Я неправильно понимаю что-то фундаментальное здесь?Если то, что я пытаюсь сделать, не лучший способ справиться с этим.Что такое?Приложение JSP должно существовать, поскольку оно обеспечивает необходимую функциональность, а Angular предоставляет возможность отображать / взаимодействовать с данными так, как приложение JSP не может.

1 Ответ

0 голосов
/ 10 июля 2019
  • Причины, приводящие к ошибке CORS-

    1. Браузер не может понять, какой сервер должен использовать для отправки запроса от сети до конца. Потому что их 2 сервера, работающих на то же самое приложение, сначала ваш локальный угловой сервер , который является localhost & other - это сервер вашего внутреннего сервера, который является либо tomcat, либо любым другим , поэтому из-за конфликтов в браузере сервера не понимает сервер, который ударил этот запрос и, следовательно, произошла ошибка CORS.

    2. Глупые орфографические ошибки в вашем URL или отсутствие какой-либо части URL.

  • Профилактика или решение -

    1. Разрешить все запросы, поступающие на резервный сервер, такие как GET, POST, DELETE, PUT и т. Д., Как весной вы можете использовать @Crossorigin ("*"). Вместо * Вы можете использовать свои настройки, чтобы разрешить в CrossOrigin.
    2. Избегайте орфографических ошибок и обрезки частей URL

403 означает запрещенный запрос- (сервер ограничивает ваш запрос на отправку)

401 означает «Несанкционированный запрос» (как правило, когда нет данных для входа в систему или токен истекает или токен в запросе)

...