如何在泽西岛生命周期中拦截请求?

2022-08-31 22:10:04

我已经使用泽西岛一年了,只是偶然发现了一个我找不到答案的问题:你如何拦截(或挂钩)泽西岛请求生命周期?

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

谢谢!

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


答案 1

我找到了答案。

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

public ContainerRequest filter(ContainerRequest req);

之后,在 Web 的 servlet 配置中包含以下 XML.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


答案 2

这个线程有点旧,但我在请求之前和之后都有一段时间拦截。在网上搜索了很长时间后,我终于弄清楚了这一点:

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


推荐