ContainerResponseFilter 未执行

ContainerResponseFilter not executed

我想用 Jax-Rs 构建一个 REST-API 并启用 cors。所以我用谷歌搜索了怎么做并找到了这个:

http://www.developerscrappad.com/1781/java/java-ee/rest-jax-rs/java-ee-7-jax-rs-2-0-cors-on-rest-how-to-make-rest-apis-accessible-from-a-different-domain/

解决方案是 ResponseFilter,它向每个响应添加一些 header 信息,以便用户的浏览器知道允许跨域访问。

因为当我发出任何请求(尝试 GET、POST 和 OPTIONS)时没有执行 ResponseFilter,我再次搜索并发现了这个:

ContainerResponseFilter not working

@lefloh 给出了一个很好的答案,这听起来合乎逻辑(删除注释@PreMatching)。它这样做了,但是当我执行 Http-Request.

时,我的过滤器没有被调用

这是我的代码:

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class RESTServiceResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext parContainerRequestContext, ContainerResponseContext parContainerResponseContext) throws IOException {
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Origin", "*" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, DELETE, PUT" );
        parContainerResponseContext.getHeaders().add( "Access-Control-Allow-Headers", "Content-Type" );
    }
}

我继续谷歌搜索,发现我忘记将过滤器添加到 web.xml。所以我也这样做了:

<servlet>
    <display-name>webinterface.api</display-name>
    <servlet-name>JAX-RS REST Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>de.tsystems.lbus.apprestserver</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>de.apprestserver.filter.RESTServiceResponseFilter</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>JAX-RS REST Servlet</servlet-name>
    <url-pattern>/TNR/*</url-pattern>
</servlet-mapping>

我现在没有更多的想法,想问问你,你是否可以为我提供解决方案。提前致谢!

您正在使用 Jersey 1(可以通过 web.xml 中的 com.sun.jersey 判断)。您正在使用(或向我们展示)的过滤器实现是 Jersey 2。存在细微差别,但这是一个主要区别。后者不适用于 Jersey 1。

而且它甚至可以编译(如果是这样的话)这一事实意味着您需要摆脱一些依赖性。您拥有的 class 是 JAX-RS 2 class(接口)。任何 JAX-RS/Jersey 2 依赖项,你可能有,摆脱它们。他们玩得不好(也许不是问题的原因,但摆脱他们以消除任何混乱)

  • 球衣 1 == com.sun.jersey(保持)
  • 球衣2 == org.glassfish.jersey(去掉)
  • JAX-RS 2 api == javax.ws.rs-api(去掉)

See here for Jersey 1 implementation and configuration