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

Posted

技术标签:

【中文标题】如何启用 CORS tomcat 8.5 过滤器来访问静态文件?【英文标题】:How to enable CORS tomcat 8.5 filter to access static files? 【发布时间】:2019-10-17 00:29:10 【问题描述】:

我阅读了很多类似的问题,但没有一个给定的解决方案对我有用,所以我发布了另一个:/ 我必须从我的 Angular 客户端获取我的 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 ecc...) 丢失。

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

我将 Cors 过滤器放在我的 web.xml 文件中,在“内置过滤器定义”会话中的第一个位置,但它不起作用。 根据Tomcat官方文档,我添加了很多&lt;init-param&gt;,但是没有用。 我尝试使用自定义 Cors 过滤器,实现 HttpServletRequestHttpServletResponse 并使用 ContainerRequestContextContainerResponseContext 实现,但两者都不起作用。

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

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

【问题讨论】:

您能否提供正在尝试从Tomcat服务器访问资源的客户端应用程序的请求url。 来源是localhost:4200/pdf,请求的资源是localhost:8080/web-docs/file.pdf 如果您的意思是具体的获取调用 url,我不知道,因为外部库不会向我显示明确的 url。我在我的角度应用程序中使用 并且组件进行调用 您必须验证类 org.apache.catalina.filters.CorsFilter 是否已加载。检查您的tomcat服务器的lib目录中是否有Catalina.jar,如果有,那么您可以在重新启动tomcat实例后尝试从角度客户端访问pdf,如果不包含jar并尝试。 我检查了,catalina.jar 在 /lib 中。我用WinRar打开了jar,路径是对的,还有che CorsFilter类。 【参考方案1】:

如下添加,

<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>

【讨论】:

这适用于 Tomcat 8.5!你能告诉如何使用实际模式吗?我只想允许引用者:[ual.domain.pl/] 和 'qua.domain.pl' 你能展示非 80 端口和所有子位置的示例吗:'uad.domain.pl:8080*'? 好吧,我想通了。它像这样转到 uat.domain.pl,https://qua.domain.pl:8080</param-value> :)【参考方案2】:

我没有测试它,但我想您可能想尝试使用 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 确实提到了httpHeadersin conjunction with CORS。

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

【讨论】:

已解决:我有三个不同的 tomcat 实例,CATALINA_HOME 错误。修复了该变量,即使没有过滤器规格也能正常工作。大错特错见谅

以上是关于如何启用 CORS tomcat 8.5 过滤器来访问静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要在 tomcat 应用程序上启用 CORS

为在IntelliJ中运行的Tomcat启用CORS

使用 Spring MVC 为所有 API 启用 CORS

如何在 Spring 4.2 中启用 CORS 过滤器

在 Java Play 应用中启用 CORS 过滤器

在具有 Java 8 的嵌入式 Tomcat 8.5 上启用 TLS 握手的可观察性(日志记录/指标)