如何从HttpServletRequest中获取外网IP地址

本文介绍如何使用Java从HttpServletRequest中获取用户的外网IP地址。详细解释了直接通过getRemoteAddr()方法获取IP的方式,并针对多级代理的情况提供了从HTTP请求头部获取真实IP的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何从HttpServletRequest中获取外网IP地址

Java 中可以通过HttpServletRequest类的getRemoteAddr();

//可能是用户真是ip也可能是代理服务器的ip
String client_ip=request.getRemoteAddr();

如果经过了中间层通过该方法无法直接获取ip,此时需要从HTTP请求的Header里面获取ip

String ip = request.getRemoteAddr();
/**
* X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP
* 只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项
* 标准格式如下:X-Forwarded-For: client_ip, proxy1_ip, proxy2_ip
* 此头是可构造的,因此某些应用中应该对获取到的ip进行验证
*/
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("x-forwarded-for");
}
/**
*在多级代理网络中,直接用getHeader("x-forwarded-for")可能获取到的是unknown信息
*此时需要获取代理代理服务器重新包装的HTTP头信息,
*/
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    //Apache+WebLogic搭配下出现的头
    ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknow".equalsIgnoreCase(ip)) {
    //Apache+WebLogic搭配下出现的头
    ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    //可通过http头伪造,是由代理服务器发送的请求头
    ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    //可通过http头伪造,和X-Forwarded-For格式类似,以“,"分隔
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}

今天有用到,自己打号备忘!

### Java代码实现获取设备的公网IP地址 在Java中,可以通过多种方法来获取设备的公网IP地址。以下是几种常见的实现方式: #### 方法一:通过HTTP请求外部服务 利用第三方API服务(如`httpbin.org/ip` 或 `api.ipify.org`),可以发送HTTP GET请求并解析返回的结果。 ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class PublicIPAddress { public static void main(String[] args) throws Exception { URL url = new URL("https://api.ipify.org?format=json"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { StringBuilder response = new StringBuilder(); String line; while ((line = in.readLine()) != null) { response.append(line); } System.out.println(response.toString()); // 输出JSON格式的公网IP信息 } } } ``` 此方法依赖于外部服务提供准确的公网IP数据[^4]。 --- #### 方法二:基于HttpServletRequest对象 如果程序运行在一个Web环境中,可以直接从`HttpServletRequest`对象中提取客户端的真实IP地址。这种方法适用于服务器端应用。 ```java import javax.servlet.http.HttpServletRequest; public class IPAddressUtil { public static String getClientIp(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } public static void main(String[] args) { // 此处仅作为示例展示逻辑,实际需注入HttpServletRequest实例 System.out.println(getClientIp(null)); } } ``` 该方法适合用于处理代理环境下的真实IP捕获需求。 --- #### 方法三:使用InetAddress类 虽然`InetAddress.getLocalHost().getHostAddress()`通常只返回局域网内的私有IP地址,但在某些特定场景下也可以尝试调用公共DNS查询接口间接得到公网IP。 注意:这种方式并不推荐直接应用于生产环境,因为其准确性无法完全保障[^3]。 --- ### 总结 最可靠的方式仍然是借助成熟的在线服务完成公网IP检测任务。上述提到的第一种方案即为此目的设计而成,并且已被广泛验证可行性和稳定性[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值