2010-12-05 72 views
48

我已经在一年的较好的一段时间里使用了Jersey,并且偶然发现了一个我无法找到答案的问题:你如何拦截(或挂入)Jersey请求生命周期?在泽西岛生命周期中,如何拦截请求?

理想情况下,我能够执行一些自定义筛选/确认/时之间拒绝接受容器从网络请求和时间我的处理方法被调用。如果有一种简单的方法可以通过子路径过滤拦截器(例如,在/下有任何拦截器,在/ user /下有其他任何拦截器等),则可获得奖励点。

谢谢!

编辑:为了更清楚一点,这里的总体思路是要能够写一些代码,将许多API调用运行,而无需显式调用每个处理程序方法的代码。这将减少额外的代码,并消除了传递请求上下文的需要。

+0

你想要什么样的筛选,验证,拒绝?例如,您可以创建自己的MessageBodyWriter/Reader来处理验证。或者,您可以在构造函数中为自定义HTTP标头解析或URI解析设置@Context。 – Marc 2010-12-05 09:53:34

+0

此功能的大多数应用程序将与安全性有关。例如,我的(非泽西岛)Web应用程序将为泽西岛的某些AJAX调用(全部在相同路径下)生成一次性使用的随机数。拦截器将负责检查这个随机数的有效性。 – cww 2010-12-05 10:04:51

+0

@Marc可以告诉你更多关于“或者你可以在构造函数中为自定义HTTP头解析或URI解析设置@上下文”的部分吗? – Mat 2012-12-20 15:42:55

回答

50

我已经找到了答案?

首先,创建一个实现ContainerRequestFilter的类。该接口指定以下方法,在该方法中进行过滤。 ContainerRequest对象包含有关当前请求的信息。

public ContainerRequest filter(ContainerRequest req); 

之后,包括在servlet配置下面的XML在web.xml

<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>path.to.filtering.class</param-value> 
</init-param> 

来源:

http://jersey.576304.n2.nabble.com/ContainerRequestFilter-and-Resources-td4419975.html http://markmail.org/message/p7yxygz4wpakqno5

-1

你有没有看着泽西ClientFilter类?

目前,我们正在使用这种拦截并执行API versioing等。还有建在日志过滤器 - 这样你就可以看代码为他们拿到什么就写一个想法。

的签名是:

.... 
cr.getHeaders() 
.... 
return getNext().handle(cr); 
+1

它看起来像只适用于客户端。你知道服务器是否有类似的过滤机制? – cww 2010-12-05 11:59:43

0

对于我们使用的平纹具体类做这样的事情的服务器部分:ContainerResponseFilter

public ClientResponse handle(final ClientRequest cr) throws ClientHandlerException... 

所以,你可以做这样的东西开始

签名是:

public ContainerResponse filter(ContainerRequest request, ContainerResponse response) 

那么你可以做这样的方法调用:

Object entity = response.getEntity(); 
    ... your logic here ... 
return response; 

这可能是一些帮助..

8

这个线程是有点老了,但我有一段时间拦截之前和之后的请求。在网络上经过长时间的搜寻之后,我终于想通了这一点:

<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
    <param-value>blah.LoggingFilter</param-value> 
</init-param> 
<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>blah.LoggingFilter</param-value> 
</init-param> 

,然后这个类:

public class LoggingFilter extends LoggingFilter implements ContainerRequestFilter { 

    private static final ThreadLocal<Long> startTime = new ThreadLocal<Long>(); 
    public static boolean verboseLogging = false; 

    @Override 
    public ContainerRequest filter(ContainerRequest arg0) { 
     startTime.set(System.currentTimeMillis()); 
     return arg0; 
    } 

    @Override 
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { 
     System.out.println(System.currentTimeMillis() - startTime.get().longValue()); 
     StringBuilder sb = new StringBuilder(); 
     sb.append("User:").append((request.getUserPrincipal() == null ? "unknown" : request.getUserPrincipal().getName())); 
     sb.append(" - Path:").append(request.getRequestUri().getPath()); 
     //... 
    } 

这拦截在开始请求和结束,所以你可以把一个计时器管他呢。

这适用于泽西岛1.17。不确定关于2.x.