我正在编写一个日志记录过滤器,记录在Jersey中运行的Web应用程序的所有HTTP请求/响应。 ContainerResponseFilter
似乎是一个直接的解决方案,我已设法让它发挥作用。
下一步是记录请求的IP。有没有办法在ContainerResponseFilter
?
答案 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实现允许您直接将HttpServletRequest实例注入到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.RequestFacade
(link)的代理。此代理作为您的Coyote(HTTP连接器)的直接热线,从而作为Coyote请求对象(link)。
希望这在某种程度上有所帮助:) - 祝你有愉快的一天。