我读了很多类似的问题,但是没有给定的解决方案对我有用,所以我要发布另一个问题:/我必须从我的有角度的客户端上获得我的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>
,但是没有用。
我尝试使用具有HttpServletRequest
和HttpServletResponse
实现的自定义Cors过滤器,也使用了ContainerRequestContext
和ContainerResponseContext
的实现,但是两者均无效。
当我写“ http://localhost:8080/web-docs/file.pdf”时,我的浏览器显示它。当我尝试从客户端获取文件时,我被CORS阻止。
如何设置良好的Cors过滤器以从我的应用访问该文件?我在哪里做错了?
答案 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>