如何启用 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官方文档,我添加了很多<init-param>
,但是没有用。
我尝试使用自定义 Cors 过滤器,实现 HttpServletRequest
和 HttpServletResponse
并使用 ContainerRequestContext
和 ContainerResponseContext
实现,但两者都不起作用。
当我写“http://localhost:8080/web-docs/file.pdf”时,我的浏览器会显示它。当我尝试从我的客户端获取文件时,我被 CORS 阻止了。
如何设置良好的 Cors 过滤器以从我的应用程序访问该文件?我哪里做错了?
【问题讨论】:
您能否提供正在尝试从Tomcat服务器访问资源的客户端应用程序的请求url。 来源是localhost:4200/pdf,请求的资源是localhost:8080/web-docs/file.pdf 如果您的意思是具体的获取调用 url,我不知道,因为外部库不会向我显示明确的 url。我在我的角度应用程序中使用如下添加,
<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*'? 好吧,我想通了。它像这样转到我没有测试它,但我想您可能想尝试使用 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,我认为这不是你的问题。
【讨论】:
已解决:我有三个不同的 tomcat 实例,CATALINA_HOME 错误。修复了该变量,即使没有过滤器规格也能正常工作。大错特错见谅以上是关于如何启用 CORS tomcat 8.5 过滤器来访问静态文件?的主要内容,如果未能解决你的问题,请参考以下文章