您的位置:首页 > 理论基础 > 计算机网络

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

2016-07-15 15:44 537 查看

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


今天有用到,自己打号备忘!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: