如何在泽西岛生命周期中拦截请求?
我已经在一年多的时间里使用过泽西了,并且偶然发现了一个我无法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);