在SO中,关于此问题有多个答案。它们全部归结为在web.xml(在应用程序或服务器中)中配置CORSFilter。而且我已经尝试并且仍在尝试使这项工作有效。 详细信息如下: 前端:在localhost:4200上运行的Angular 5应用 后端:在 https :// localhost:4553的Tomcat 8上运行的基于cxf的REST应用 web.xml中的CORS过滤器映射:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Allow-Origin, Access-Control-Request-Headers, Authorization</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Content-Type, Authorization</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我正在使用基于AuthInterceptor的基于JWT令牌的身份验证,该身份验证在每个请求中都将header中的Bearer令牌附加到头中。
身份验证的其余端点是: https://localhost:8453/onlinecounselling/service/auth
拦截器代码:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Authorization: `${this.auth.getAccessToken().flatMap(t => `Bearer ` + t)}`
}
});
return next.handle(request);
}
现在,当我发送此身份验证请求时,首先,该请求将进入预检模式(不知道为什么,我检查了MDN article却没有找到原因) )并发送一个OPTIONS请求,与此相关的请求标头是:
Request Headers
Access-Control-Request-Headers: content-type,no-token
访问控制请求方法:POST 来源:http://localhost:4200 用户代理:Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 68.0.3440.106 Safari / 537.36
响应头就是这些:
Cache-Control: private
Content-Length: 0
Content-Type: text/plain
Date: Sat, 08 Sep 2018 16:02:31 GMT
Expires: Thu, 01 Jan 1970 05:30:00 IST
在CORSFilter中没有提供与CORS相关的标头。
我遵循了answer(这是Tomcat站点的CORSFilter文章),并咨询了许多其他文章,但尚未找到任何解决方案。
我已经从Postman进行了测试,尽管工作正常,但我发现Postman与发送请求时浏览器的工作方式不同。
如果需要其他详细信息,请告诉我。我在这里待了两天。
答案 0 :(得分:0)
尝试将"no-token"
标头添加到"cors.allowed.headers"
部分。
答案 1 :(得分:0)
我的解决方案是使我的请求通过proxy.conf.json并设置responseType:'text'或'text / json'或您需要的任何内容。这使响应最终到达我的console.log()。 source。