问与答 java-在Jersey生命周期中如何拦截请求?

alston · 2020-02-22 18:00:06 · 热度: 241

我已经用了一年多的时间来使用Jersey,但偶然发现了一个我找不到答案的问题:如何截获(或连接)Jersey请求的生命周期?

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

谢谢!

编辑:为了更清楚一点,此处的总体思路是能够编写一些可用于许多API调用的代码,而不必从每个处理程序方法中显式调用该代码。 这将减少额外的代码,并且不需要传递请求上下文。

猜你喜欢:
共收到 4 条回复
bethany #1 · 2020-02-22 18:00:06

我找到了答案。

首先,创建一个实现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.你2.那BB了.com/container request filter-安定-resources-他的4419975.HTML][HTTP://mark mail.org/message/怕7也需要关注4WPA开启no5]

reginald #2 · 2020-02-22 18:00:07

这个线程有点旧,但是我在请求之前和之后都有一段截取时间。 经过长时间的网上搜索,我终于明白了:

<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。

adonis #3 · 2020-02-22 18:00:09

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

签名是:

public ContainerResponse filter(ContainerRequest request, ContainerResponse response)

那么您可以拨打以下电话:

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

这可以帮上忙吗?

ian #4 · 2020-02-22 18:00:10

您看过球衣ClientFilter吗?

当前,我们正在使用它来拦截和执行API版本控制等。内置了日志记录过滤器-因此您可以查看它们的代码以了解编写内容。

签名是:

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

因此,您可以开始执行以下操作:

....
cr.getHeaders()
....
return getNext().handle(cr);
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册