Tomcat 8 忽略 CORS 过滤器(web.xml、in-code 等)

Posted

技术标签:

【中文标题】Tomcat 8 忽略 CORS 过滤器(web.xml、in-code 等)【英文标题】:Tomcat 8 ignores CORS filters (web.xml, in-code, etc) 【发布时间】:2016-08-31 21:20:51 【问题描述】:

由于某些奇怪的原因,Tomcat 8(在 w2k12 服务器上)忽略了我在 tomcat8/conf/web.xml 上的 CORS 过滤器设置,根据 Apache Tomcat 8 文档,这些设置如下:

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

它确实适用于 GET 请求,但是当我尝试执行 POST 时,我收到 403 Forbidden 错误:

Origin http://webapp.mycompany.com is not allowed by Access-Control-Allow-Origin.

http://webapp.mycompany.com 是我公司的托管服务提供商,具有标准功能,您可以通过与 cpanel 共享托管获得,我的前端在那里,它将请求发送到我安装了 Tomcat 8 服务器和 webapp WAR 的另一个域这是一个基于 Jersey 的 REST Api。

现在,根据 Apache 官方文档中的默认设置,我使用的配置是它工作所需的最低配置。

我尝试然后将过滤器移动到应用程序的 web.xml,但没有运气,尝试添加更多配置,如允许的方法,尝试直接在响应中添加标题,如下所示:

Response.status(Response.Status.OK)
        .entity(relaciona)
        .header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD")
        .header("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept")
        .header("Access-Control-Max-Age", "1728000")
        .build();

没用。

非常感谢您对此提供任何帮助,为了确认,请尝试以下操作:

尝试分别在服务器和 webapp web.xml 文件中设置配置,不成功 尝试将标头添加到 Jersey REST Api 中的每个响应,但没有成功 对 API 的请求是使用带有引导程序和 jQuery 的 html5 前端完成的,尝试将 crossDomain:true 添加到 ajax 请求中,没有区别。 在 web 和服务器 web.xml 文件中的 xml 中添加了源域(单独测试),但都不起作用

谢谢!

【问题讨论】:

嗨 Adrian E. Labastida Cañizares,您是否实现了 @Option 函数以便在您的响应中执行 POST。您能否检索响应网络详细信息(状态代码、消息....)以帮助您。 我在做 POST 时得到的响应代码是 403 Forbidden 并且消息也在那里 Origin webapp.mycompany.com 是 Access-Control-Allow-Origin 不允许的,关于 @Option 函数,应该在哪里我试试看?谢谢 你试过@Option(下面的回复)吗? 【参考方案1】:

一旦您使用跨域查询 POST,您需要为 @POST /@PUT / @DELETE 查询定义 @OPTION。

您是否定义了@Option 类来定义您的@Post?

下面是一个例子:

@OPTIONS
@Compress
@Path("/mypost")
@Consumes( MediaType.MULTIPART_FORM_DATA )
@Produces( MediaType.APPLICATION_JSON )
public Response mypost_opts() 
    return Response.ok().build();




@POST
@Compress
@Path("/mypost")
@Consumes( MediaType.MULTIPART_FORM_DATA )
@Produces( MediaType.APPLICATION_JSON )
public Response mypost() 
    return Response.ok().build();

【讨论】:

我没有那个@OPTIONS注解和代码,我试试,谢谢!

以上是关于Tomcat 8 忽略 CORS 过滤器(web.xml、in-code 等)的主要内容,如果未能解决你的问题,请参考以下文章

CORS - 从角度调用Tomcat上的休息服务

CORS 过滤器在我的 Java 应用程序中不起作用

Pentaho CDA:基本身份验证和 CORS 冲突

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

Tomcat CORS 过滤器和 Spring Security

使用 web.xml 在 Tomcat 8 上设置自定义过滤器