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

我已经在一年多的时间里使用过泽西了,并且偶然发现了一个我无法find答案的问题:你如何拦截(或挂钩)泽西岛请求生命周期?

理想情况下,我可以在容器接受来自networking的请求和调用处理程序方法的时间之间执行一些自定义筛选/validation/拒绝。 奖励点,如果有一个简单的方法来过滤拦截器的子path(例如有一个拦截器/下的任何东西,另一个/ user /等下的任何东西)。

谢谢!

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

我find了答案。

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

public ContainerRequest filter(ContainerRequest req); 

之后,在web.xml中的servletconfiguration中包含以下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

这个线程有点旧了,但是我有一段时间在请求之前和之后拦截。 在networking上search了很长时间后,我终于明白了这一点:

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

对于服务器部分,我们使用Jersey Specific类来做这样的事情: ContainerResponseFilter

签名是:

 public ContainerResponse filter(ContainerRequest request, ContainerResponse response) 

那么你可以打电话如:

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

这可以有一些帮助吗?

你看了Jersey ClientFilter类吗?

我们目前正在使用这个来拦截和执行API versioing等。内置的日志filter – 所以你可以看看他们的代码,以了解要写什么。

签名是:

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

所以你可以开始做这样的事情:

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