You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:28:56