Настройка
У меня есть приложение 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 не может.