java - 拦截 JAX-RS 请求 : Register a ContainerRequestFilter with tomcat

标签 java web-services rest tomcat jax-rs

我正在尝试通过 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/

相关文章:

java - Google map v2 中的动画信息窗口

java - 连续编辑一个 1MB 的文件,怎样才更有效率?

java - Java 线程中的同步

java - 在maven中降级嵌入式tomcat版本

java.sql.SQLException : No suitable driver found for jdbc:mysql

java - WSDL 中没有指定操作

web-services - 应用服务的固定和预留出站 IP

java - 带有 BindingResult 的 @Valid JSON 请求导致 IllegalStateException

rest - RESTFul HATEOAS API 中的 HTTP POST 请求

java - Restful webservices....放置或发布更新