如何在Jersey生命周期中拦截请求?

时间:2010-12-05 09:47:17

标签: java api jax-ws jersey jax-rs

我在一年中的大部分时间都使用了泽西岛,并且偶然发现了一个我无法找到答案的问题:你如何拦截(或挂钩)泽西岛请求生命周期?

理想情况下,我可以在容器接受来自网络的请求和调用处理程序方法的时间之间执行一些自定义过滤/验证/拒绝。如果有一种简单的方法可以通过子路径过滤拦截器(例如,对于/下的任何内容都有一个拦截器,对于/ user /下的任何东西,等等),可以获得奖励积分。

谢谢!

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

4 个答案:

答案 0 :(得分:50)

我找到了答案。

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

public ContainerRequest filter(ContainerRequest req);

之后,在web.xml

中的servlet配置中包含以下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 :(得分:9)

这个帖子有点陈旧,但是我有时间拦截之前和之后请求。经过长时间的网络搜索后,我终于弄明白了:

<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());
        //...
    }

这会在开始和结束时拦截请求,以便您可以输入计时器或其他任何内容。

适用于Jersey 1.17。不确定2.x。

答案 2 :(得分:0)

对于服务器部分,我们使用Jersey Specific类来执行以下操作:ContainerResponseFilter

签名是:

public ContainerResponse filter(ContainerRequest request, ContainerResponse response)

然后你可以进行如下调用:

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

这可以提供一些帮助吗?..

答案 3 :(得分:-1)

你看过泽西岛ClientFilter班吗?

我们目前正在使用它拦截和执行API版本等。内置日志记录过滤器 - 所以你可以查看它们的代码,以了解要写什么。

签名是:

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

所以你可以从做的事情开始:

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