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

时间:2016-05-05 22:52:52

标签: java rest tomcat cors

出于一些奇怪的原因,根据Apache Tomcat 8文档,Tomcat 8(在w2k12服务器上)忽略了我在tomcat8 / conf / web.xml上的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>

它适用于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的请求是使用带有bootstrap和jQuery的HTML5前端完成的,尝试将crossDomain:true添加到ajax请求中,没有区别。
  • 在web和服务器web.xml文件中添加了原始域到xml(单独测试)并且都没有工作

谢谢!

1 个答案:

答案 0 :(得分:0)

一旦使用crossdomain查询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();
}