如何在JdkHttpServerFactory框架下获取请求者的远程IP地址?
当然可以!在Jersey基于JDK Http Server的环境下,获取请求者的远程IP其实很简单,给你几种实用的实现方式:
方法1:直接在资源类中获取底层HttpExchange对象
Jersey和JDK Http Server集成时,会把核心的HttpExchange对象存入请求上下文的属性中,你可以直接取出并调用它的地址方法:
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.container.ContainerRequestContext; import com.sun.net.httpserver.HttpExchange; @Path("/ip") public class IpResource { @GET public String getRemoteIp(@Context ContainerRequestContext requestContext) { // 从请求上下文取出HttpExchange实例 HttpExchange exchange = (HttpExchange) requestContext.getProperty("com.sun.net.httpserver.HttpExchange"); // 获取远程IP地址 String remoteIp = exchange.getRemoteAddress().getAddress().getHostAddress(); return "你的远程IP是:" + remoteIp; } }
方法2:用过滤器统一处理IP(适合多资源复用场景)
如果你的多个接口都需要获取远程IP,可以写一个全局请求过滤器,提前把IP存入上下文属性,后续资源类直接取用即可:
import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.ext.Provider; import com.sun.net.httpserver.HttpExchange; @Provider // 标记为Jersey可识别的组件 public class RemoteIpFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { HttpExchange exchange = (HttpExchange) requestContext.getProperty("com.sun.net.httpserver.HttpExchange"); String remoteIp = exchange.getRemoteAddress().getAddress().getHostAddress(); // 将IP存入上下文,供后续资源类使用 requestContext.setProperty("REQUEST_REMOTE_IP", remoteIp); } }
在资源类中使用时就简化很多:
@GET @Path("/demo") public String useFilteredIp(@Context ContainerRequestContext requestContext) { String remoteIp = (String) requestContext.getProperty("REQUEST_REMOTE_IP"); return "通过过滤器获取的IP:" + remoteIp; }
额外说明:反向代理场景的IP获取
如果你的服务部署在Nginx等反向代理之后,直接获取的remoteAddress会是代理服务器的IP,这时候需要优先读取代理传递的请求头(比如X-Forwarded-For),示例代码:
public String getRealIp(@Context ContainerRequestContext requestContext) { // 先尝试从代理头获取真实IP String realIp = requestContext.getHeaderString("X-Forwarded-For"); if (realIp == null || realIp.trim().isEmpty()) { // 没有代理头时再取底层连接的IP HttpExchange exchange = (HttpExchange) requestContext.getProperty("com.sun.net.httpserver.HttpExchange"); realIp = exchange.getRemoteAddress().getAddress().getHostAddress(); } return "真实IP:" + realIp; }
你使用的Jersey 2.23.2版本完全支持上述所有API,放心用就好~
内容的提问来源于stack exchange,提问作者user3892260
相关产品推荐
相关产品推荐

