我读了很多类似的问题,但没有一个给定的解决方案对我有用,所以我发布了另一个:/我必须从我的角度客户端获取我的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 过滤器,具有HttpServletRequest
和HttpServletResponse
实现,并使用ContainerRequestContext
和ContainerResponseContext
暗示,但两者都不起作用。
当我写"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,我认为这不是您的问题所在。