我试图通过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>
但这也不起作用。我想念什么?有什么想法使该过滤器起作用吗?任何帮助都非常感谢!
您在您的类中使用JAX-RS 2.0 API(请求过滤器,名称绑定等),但在您的Jersey 1专有的初始化参数中web.xml(以com.sun.jersey,Jersey 2开头的包使用org.glassfish.jersey)。
web.xml
com.sun.jersey
org.glassfish.jersey