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

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

如何从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");
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值