我正在尝试通过 ContainerRequestFilter 拦截对我的 JAX-RS Web 服务的请求。我想将它与自定义注释一起使用,这样我就可以装饰 Web 服务的某些方法。这应该使我能够根据是否在安全通道上发出的信息来处理对此方法的请求
或不,在执行实际方法之前。
我尝试了不同的方法,搜索了几篇文章,然后主要根据奥尔登在这篇文章中的回答来实施post。
但我无法让它工作。
我的 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 中注册过滤器here.
<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>
但这也行不通。我缺少什么?有什么想法可以让过滤器发挥作用吗?非常感谢任何帮助!