我在我的应用程序中使用Jersey 1.8。现在,有很多服务类。有没有办法记录所有来自不同服务的请求。这意味着,是否可以创建类似于通用过滤器的东西,所有请求都将通过该过滤器发送,我可以从中跟踪和记录所有传入请求。
问问题
818 次
3 回答
3
是的,这很容易:
创建一个提供者,例如GenerelAccessHandler.java
:
@Provider
public final class GeneralAccessHandler implements ContainerRequestFilter, ContainerResponseFilter {
/** The incoming request we obtained. */
@Context
private final HttpServletRequest mHttpServletRequest;
/** Some useful informations about the accesspoint in our service. */
@Context
private final UriInfo mUriInfo;
@Override
public ContainerRequest filter(final ContainerRequest request) {
if (null != mHttpServletRequest) {
System.out.println("Method: " + mHttpServletRequest.getMethod());
System.out.println("Session: " + mHttpServletRequest.getSession().getId());
System.out.println("User Agent: " + mHttpServletRequest.getHeader("user-agent"));
final String addr = mHttpServletRequest.getRemoteAddr();
final int port = mHttpServletRequest.getRemotePort();
System.out.println("Client: " + addr + ":" + port);
}
if (null != mUriInfo) {
System.out.println("URI: " + mUriInfo.getRequestUri().getPath());
}
return request;
}
@Override
public ContainerResponse filter(final ContainerRequest pReq, final ContainerResponse pResp) {
System.out.println("Outgoing Response")
return pResp;
}
}
在您的 web.xml 中,您可以将两个 init-params 添加到您的 Servlet,指向这个 AccessHandler,如下所示:
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>your.fully.qualified.GeneralAccessHandler</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>your.fully.qualified.GeneralAccessHandler</param-value>
</init-param>
这个类现在将是每个请求的第一个和最后一个位置。你可以在这里做任何你想做的事。使用您的记录器记录它,使用来自 logback 的 MDC 等 pp。
希望这可以帮助!
于 2014-03-25T15:24:29.593 回答
0
您可以实现 com.sun.jersey.spi.container.ContainerRequestFilter 并将其作为 init-param 添加到您的 Jersey Servlet。
我在这里使用 JerseySpringServlet:
<servlet>
<servlet-name>Jersey Spring Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.domain.my.implements.containerrequestfilter.MyFilter</param-value>
</init-param>
</servlet>
于 2014-03-25T15:14:43.180 回答
0
如果您使用的是 Jersey 2+
@Provider
public final class GeneralAccessHandler implements ContainerRequestFilter, ContainerResponseFilter {
@Context
private HttpServletRequest servReq;
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
System.out.println("Method: " + requestContext.getMethod());
System.out.println("Path: " + requestContext.getUriInfo().getPath());
System.out.println("User Agent: " + requestContext.getHeaderString("user-agent"));
final String addr = servReq.getRemoteAddr();
final int port = servReq.getRemotePort();
System.out.println("Client: " + addr + ":" + port);
System.out.println("URI: " + requestContext.getUriInfo().getRequestUri());
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
//When there is no response
}
}
如已接受的答案所述,向 servlet 注册:
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>your.fully.qualified.GeneralAccessHandler</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>your.fully.qualified.GeneralAccessHandler</param-value>
</init-param>
于 2016-07-21T00:06:35.027 回答