如何启用CORS tomcat 8.5过滤器访问静态文件?

时间:2019-05-31 10:49:29

标签: java tomcat cors

我读了很多类似的问题,但是没有给定的解决方案对我有用,所以我要发布另一个问题:/我必须从我的有角度的客户端上获得我的Tomcat 8.5.37服务器上的一些pdf文件,但是我是经常被Cors政策封锁。

如何正确添加Cosr标头?

我正在使用Tomcat 8.5.37(实际上是本地主机),

首先,我在/ webapps / my-files下为该文件创建了一个文件夹,并在其中放入了一个简单的“ file.pdf”,然后在server.xml的标记中添加了以下内容:

<Context docBase="/my-files" path="/web-docs"></Context>

然后将其放在我的web.xml文件中:

<filter>
 <filter-name>CorsFilter</filter-name>
 <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
 <filter-name>CorsFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

我的客户端应用程序是Angular 7应用程序,我正在使用“ ng2-pdf-viewer”模块显示pdf文件。根据模块文档,它对指定的URL进行HTTP get调用以获取文件并显示它。因此,我可以在Chrome控制台的“网络”会话中看到get呼叫。在“响应标头”会话中,我可以看到一些标头,例如带有正确值的“ Content-Type”和“ Content-Lenght”,但所有其他标准Cors标头(Access-Control-Allow-Origin,Access-Control-Allow-Methods缺少...)。

如果我使用Chrome扩展程序模拟Cors标头,则可以正确获取pdf文件,并且该组件可以按预期工作,但是如果没有此扩展程序,我将被Cors阻止。

我将Cors过滤器放在了“内置过滤器定义”会话中的第一位的web.xml文件中,但没有用。 根据Tomcat的官方文档,我添加了许多<init-param>,但是没有用。 我尝试使用具有HttpServletRequestHttpServletResponse实现的自定义Cors过滤器,也使用了ContainerRequestContextContainerResponseContext的实现,但是两者均无效。

当我写“ http://localhost:8080/web-docs/file.pdf”时,我的浏览器显示它。当我尝试从客户端获取文件时,我被CORS阻止。

如何设置良好的Cors过滤器以从我的应用访问该文件?我在哪里做错了?

2 个答案:

答案 0 :(得分:0)

我没有测试它,但我想您可能想尝试使用httpHeaders属性:

[src]="{ url: 'http://...', httpHeaders: { 'h1': 'v1', 'h2': 'v2', 'hn': 'vn' }}"

请参见https://github.com/VadimDez/ng2-pdf-viewer#src。它引用Mozilla的pdf.js属性,其中包括httpHeaders。是thus documented

 * @property {Object}     httpHeaders - Basic authentication headers.

这不是非常有用的信息。但是,ng2-pdf-viewer确实提到了httpHeaders in conjunction with CORS

也有withCredentials,但这是关于在CORS请求中发送cookie,我认为这不是您的问题所在。

答案 1 :(得分:0)

添加如下,

<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>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>