拦截JAX-RS请求:使用tomcat注册ContainerRequestFilter

ulr*_*ich 9 java rest tomcat web-services jax-rs

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

我尝试了不同的方法,搜索了几个帖子,然后主要根据Alden在这篇文章中的答案实施.但我无法让它发挥作用.

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

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

注释如下所示:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Ssl {}
Run Code Online (Sandbox Code Playgroud)

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

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

要解决这个问题,我试图描述在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>
Run Code Online (Sandbox Code Playgroud)

但这也行不通.我错过了什么?任何想法如何使过滤器工作?任何帮助真的很感激!

Mic*_*dos 9

你在你的类中使用JAX-RS 2.0 API(请求过滤器,名称绑定,......)但是你的Jersey 1专有的init params web.xml(从com.sun.jerseyJersey 2 开始使用的包org.glassfish.jersey).看看这个答案和这些文章: