CORS无法与angular 5 tomcat 8应用程序一起使用

时间:2018-09-08 17:57:12

标签: angular tomcat cors

在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与发送请求时浏览器的工作方式不同。

如果需要其他详细信息,请告诉我。我在这里待了两天。

2 个答案:

答案 0 :(得分:0)

尝试将"no-token"标头添加到"cors.allowed.headers"部分。

答案 1 :(得分:0)

我的解决方案是使我的请求通过proxy.conf.json并设置responseType:'text'或'text / json'或您需要的任何内容。这使响应最终到达我的console.log()。 source