设置
我有一个Angular应用程序在JSP应用程序的iframe中运行。 JSP应用程序是旧的,需要保留。 JSP和Angular都调用相同的REST服务。 JSP应用程序执行登录并接收会话cookie。由于Angular应用程序嵌入在SAME tomcat服务器上的JSP应用程序中,因此将传输cookie(至少我理解的是)。
tomcat
├── webapps
│ ├── jspapp
│ │ ├── ...
│ ├── angularapp
│ │ ├── ...
获取代码
... build params ...
return http.get(url,
{ params: params }).pipe(
map(
(response: Response) => {
... handle response ...
return data;
},
(error: any) => {
console.log(error);
}
)
);
获取标题
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 中,出现以下错误,
cookies /请求标头中的CSRF令牌为空或值不匹配
问题
我已验证GET和POST之间的jessionid和csrf令牌相同。我在这里误解了一些基本知识吗?如果我要尝试的方法不是解决此问题的最佳方法。什么是? JSP应用程序必须存在,因为它提供了所需的功能。Angular能够以JSP应用程序无法提供的方式来显示/交互数据。
答案 0 :(得分:0)
产生CORS错误的原因-
浏览器无法理解应该使用哪个服务器发送请求 从网络到后端。因为它们是为 相同的应用,首先是您的本地角度服务器,即本地主机& 其他是您的后端服务器,它是tomcat或其他,因此由于服务器浏览器中的冲突而无法理解 服务器打该请求,因此发生CORS错误。
您的URL中的拼写错误或URL的任何部分缺失。
预防或解决方案-
403表示禁止请求-(服务器限制您点击请求)
401表示未经授权的请求-(通常在没有登录数据或令牌过期或请求中没有令牌的情况下)