2

我在我的应用程序中使用Jersey 1.8。现在,有很多服务类。有没有办法记录所有来自不同服务的请求。这意味着,是否可以创建类似于通用过滤器的东西,所有请求都将通过该过滤器发送,我可以从中跟踪和记录所有传入请求。

4

3 回答 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 回答