如何从ContainerResponseFilter中获取源地址/ IP

时间:2014-10-04 19:21:34

标签: jersey jax-rs

我正在编写一个日志记录过滤器,记录在Jersey中运行的Web应用程序的所有HTTP请求/响应。 ContainerResponseFilter似乎是一个直接的解决方案,我已设法让它发挥作用。

下一步是记录请求的IP。有没有办法在ContainerResponseFilter

中做到这一点

1 个答案:

答案 0 :(得分:13)

简短回答:

@Provider
public class YourContextFilter implements ContainerRequestFilter {

    @Context
    private HttpServletRequest sr;

    @Override
    public synchronized void filter(ContainerRequestContext request) throws IOException {
        /*
         * Returns the Internet Protocol (IP) address of the client or 
         * last proxy that sent the request. For HTTP servlets, same as 
         * the value of the CGI variable REMOTE_ADDR.
         */
        String ip = sr.getRemoteAddr();
        // ... log it ...
    }

}

修改
(关于希望得到更详细的答案)

Afaig:

@Context注释允许注入JAX-RS - 特定组件(可能会说您可以注入上下文信息对象)。 JAX-RS本身是基于Java的RESTful Web Services over HTTP协议规范。所以我们可以注入类似的东西:

javax.ws.rs.core.UriInfo
javax.ws.rs.core.Request
javax.ws.rs.core.SecurityContext

以及
javax.servlet.http.HttpServletRequest

在泽西岛文档的国际奥委会章节中,您会发现这些注释:

  

[...] Jersey实现允许您直接将Ht​​tpServletRequest实例注入到JAX-RS组件中[...] - https://jersey.java.net/nonav/documentation/latest/user-guide.html#d0e2401

     

[...]特殊请求对象存在异常,甚至可以注入构造函数或类字段。对于这些对象,运行时将注入能够同时服务更多请求的代理。这些请求对象是HttpHeaders,Request,UriInfo,SecurityContext。可以使用@Context注释注入这些代理。 [...]

     

[...]使用servlet部署JAX-RS应用程序时,使用@Context可以使用ServletConfig,ServletContext,HttpServletRequest和HttpServletResponse。 [...]

如果你这样做,你实际上注入一个名为org.apache.catalina.connector.RequestFacadelink)的代理。此代理作为您的Coyote(HTTP连接器)的直接热线,从而作为Coyote请求对象(link)。

希望这在某种程度上有所帮助:) - 祝你有愉快的一天。