如何从ContainerResponseFilter内部获取源地址/ip

2024-04-27

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

下一步是记录请求的 IP。有没有办法从内部做到这一点ContainerResponseFilter ?


简短回答:

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

}

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

Afaig:

The @Context注解允许注入JAX-RS https://jax-rs-spec.java.net/–特定组件(有人可能会说你能够注入上下文信息对象)。 JAX-RS 本身是基于 HTTP 协议的 RESTful Web 服务的 Java 规范。所以我们能够注入如下内容:

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

and also
javax.servlet.http.HttpServletRequest

在泽西岛文档的国际奥委会章节中,您将找到以下注释:

[...] Jersey 实现允许您直接将 HttpServletRequest 实例注入 JAX-RS 组件中 [...] -https://jersey.java.net/nonav/documentation/latest/user-guide.html#d0e2401 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.RequestFacade (link https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/connector/RequestFacade.html)。该代理充当您与 Coyote(HTTP 连接器)的直接热线,从而与 Coyote 请求对象(link https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/connector/Request.html).

希望这对您有所帮助:) - 祝您有美好的一天。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从ContainerResponseFilter内部获取源地址/ip 的相关文章

随机推荐