我正在尝试通过 ContainerRequestFilter 拦截对我的 JAX-RS 网络服务的请求。我想将它与自定义注释一起使用,这样我就可以装饰 web 服务的某些方法。这应该使我能够根据是否在安全通道上发出的信息来处理对此方法的请求 与否,在实际方法执行之前。
我尝试了不同的方法,搜索了几篇文章,然后主要根据 Alden 在这个 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>
但这也行不通。我错过了什么?任何想法如何使过滤器工作?非常感谢任何帮助!
最佳答案
您在您的类中使用 JAX-RS 2.0 API(请求过滤器、名称绑定(bind)...),但在您的 web.xml
中使用 Jersey 1 专有初始化参数(以 com.sun.jersey
开头的包,Jersey 2 使用 org.glassfish.jersey
)。看看这个answer在这些文章中:
关于java - 拦截 JAX-RS 请求 : Register a ContainerRequestFilter with tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21556961/