一尘不染

拦截JAX-RS请求:向tomcat注册一个ContainerRequestFilter

tomcat

我试图通过ContainerRequestFilter拦截对我的JAX-RS
Web服务的请求。我想将其与自定义注释一起使用,以便可以装饰Web服务的某些方法。这应该使我能够在执行实际方法之前,根据是否在安全通道上发出的信息来处理对此方法的请求。

我的Web服务中有一个方法测试,装饰有自定义注释Ssl。

@POST
@Path("/test")
@Ssl
public static Response test(){      
    System.out.println("TEST ...");
}

批注如下所示:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Ssl {}

然后我设置一个过滤器实现

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.ext.Provider;

@Ssl
@Provider
public class SslInterceptor implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException
    {       
        System.out.println("Filter executed.");
    }
}

但是过滤器永远不会执行,也不会出现任何错误消息或警告。无论如何,测试方法运行良好。

为了解决该问题,我尝试按此处所述 web.xml中注册过滤器。

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

    <init-param>
      <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
      <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>

    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.my.packagewithfilter</param-value>
    </init-param>

    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.my.packagewithfilter.SslInterceptor</param-value>
    </init-param>

    <init-param>  
      <param-name>jersey.config.server.provider.packages</param-name>  
      <param-value>com.my.packagewithfilter</param-value>
    </init-param>

  </servlet>

但这也不起作用。我想念什么?有什么想法使该过滤器起作用吗?任何帮助都非常感谢!


阅读 255

收藏
2020-06-16

共1个答案

一尘不染

您在您的类中使用JAX-RS 2.0 API(请求过滤器,名称绑定等),但在您的Jersey
1专有的初始化参数中web.xml(以com.sun.jersey,Jersey 2开头的包使用org.glassfish.jersey)。

2020-06-16