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



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

如何正确添加 Cosr 标头?

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

首先,我在/webapps/my-files 下为该文件创建了一个文件夹,并在其中放置了一个简单的"file.pdf",然后在我的服务器中添加了以下内容.xml标签:

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

然后我把它放在我的网络.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-Lenght",但所有其他标准Cors标头(访问控制-允许-来源,访问控制-允许-方法ecc...)都丢失了。

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

我将 Cors 过滤器放在我的 web.xml 文件中,在"内置过滤器定义"会话中排在第一位,但它不起作用。 根据Tomcat官方文档,我添加了很多<init-param>,但它不起作用。 我尝试使用自定义的 Cors 过滤器,具有HttpServletRequestHttpServletResponse实现,并使用ContainerRequestContextContainerResponseContext暗示,但两者都不起作用。

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

如何设置一个好的 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>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

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

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

请参阅 https://github.com/VadimDez/ng2-pdf-viewer#src。它指的是Mozilla的pdf.js属性,其中包括httpHeaders。因此记录

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

这不是很有信息量。但是,ng2-pdf-viewer确实提到了httpHeaders与CORS一起。

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

最新更新