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

Jersey 如何从ContainerResponseFilter内部获取源地址/ip,jersey,jax-rs,Jersey,Jax Rs,我正在编写一个日志过滤器,用于记录在Jersey运行的web应用程序的所有HTTP请求/响应ContainerResponseFilter似乎是一个直截了当的解决方案,我已经设法让它工作了 下一步是记录请求的IP。有没有一种方法可以从容器响应过滤器内部执行此操作?简短回答: @Provider 公共类YourContextFilter实现ContainerRequestFilter{ @上下文 私有HttpServletRequest sr; @凌驾 公共同步的无效筛选器(ContainerRe

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

下一步是记录请求的IP。有没有一种方法可以从
容器响应过滤器内部执行此操作?

简短回答:

@Provider
公共类YourContextFilter实现ContainerRequestFilter{
@上下文
私有HttpServletRequest sr;
@凌驾
公共同步的无效筛选器(ContainerRequestContext请求)引发IOException{
/*
*返回客户端或服务器的Internet协议(IP)地址
*发送请求的最后一个代理。对于HTTP servlet,与
*CGI变量REMOTE_ADDR的值。
*/
字符串ip=sr.getRemoteAddr();
//…记录它。。。
}
}

编辑
(关于希望得到更详细的答复)

非洲国际集团:

@Context
注释允许注入特定组件(可以说您能够注入上下文信息对象)。JAX-RS本身是基于Java的规范,用于HTTP协议上的RESTful Web服务。因此,我们可以注入如下内容:
javax.ws.rs.core.UriInfo

javax.ws.rs.core.Request

javax.ws.rs.core.SecurityContext

而且
javax.servlet.http.HttpServletRequest

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

[…]Jersey实现允许您直接将HttpServletRequest实例注入JAX-RS组件[…]

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

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

如果您这样做,那么实际上您将注入一个名为
org.apache.catalina.connector.RequestFacade
()的代理。这个代理充当到您的Coyote(HTTP连接器)的直接热线,从而连接到Coyote请求对象()


希望这能有所帮助:)-祝你今天愉快。

哇,太棒了。你能告诉我一个很长的答案吗,这样我就能理解
HttpServletRequest
是如何被注入的了?现在再长一点,希望这能有所帮助。请随时要求改进,特别是如果我犯了错误。这对我来说不起作用。执行筛选器时,HttpServletRequest为null。这一切看起来都是正确的,只是没有连接代理。还有人有同样的问题吗?啊。不要介意。斯普林在管理我的球衣过滤器。一旦我让泽西管理它,一切都成功了。然而,这导致了一个进退两难的局面。如何允许Spring管理过滤器以便获得AOP计时,但仍然允许jersey连接HttpServletRequest(Spring对请求一无所知)。可能只是在Spring功能上下赌注。@kevinarpe我不知道你说的“不工作”是什么意思。我已经用
2.25.1
对它进行了测试,它工作正常。你可能想把你的问题表述成一个问题。