前言
不知道多久以前的一个需求谈起,需要根据用户的的不同需求(收集用户的行为、动作等等)进行定制的推送相关服务,但是如何标识每一个服务呢。。。在这过程中列举了不知道多少个解决方案,但是最后选择通过用户IP进行标识,当然其中还进行了其它的一些逻辑处理的,在这儿只谈如何使用Java语言通过HttpServletRequest获取用户IP地址,可以拿来即用哦。
分段代码实例
1、获取用户真实的IP地址,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getUserIP
* <ul>
* @description 获取用户真实的IP地址
* </ul>
* @createdTime 2017年12月30日 下午6:42:17
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getUserIP(HttpServletRequest request)
{
// 优先取 X-Real-IP
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("x-forwarded-for");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
if ("0:0:0:0:0:0:0:1".equals(ip))
{
ip = ERROR_IP;
}
}
if ("unknown".equalsIgnoreCase(ip))
{
ip = ERROR_IP;
return ip;
}
int index = ip.indexOf(',');
if (index >= 0)
{
ip = ip.substring(0, index);
}
return ip;
}
2、获取服务器IP地址,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getServerIP
* <ul>
* @description 获取服务器IP地址
* </ul>
* @createdTime 2017年12月30日 下午7:44:16
* @return String
*
* @version : V1.0.0
*/
public static String getServerIP()
{
InetAddress inetAddress;
try
{
inetAddress = InetAddress.getLocalHost();
String hostAddress = inetAddress.getHostAddress();
return hostAddress;
} catch (UnknownHostException e)
{
e.printStackTrace();
}
return ERROR_IP;
}
4、获取远程IP地址,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getRemoteIp
* <ul>
* @description 获取远程IP地址
* </ul>
* @createdTime 2017年12月30日 下午6:39:22
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getRemoteIp(HttpServletRequest request)
{
String ip = request.getHeader("x-real-ip");
if (ip == null)
{
ip = request.getRemoteAddr();
}
// 过滤反向代理的IP
String[] stemps = ip.split(",");
if (stemps != null && stemps.length >= 1)
{
// 得到第一个IP,即客户端真实IP
ip = stemps[0];
}
ip = ip.trim();
if (ip.length() > 23)
{
ip = ip.substring(0, 23);
}
return ip;
}
4、获取末尾IP地址段,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getLastIpSegment
* <ul>
* @description 获取末尾IP地址段,{@linkplain IP地址简介}
* </ul>
* @createdTime 2017年12月30日 下午6:44:09
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getLastIpSegment(HttpServletRequest request)
{
// 获取用户真实的IP地址
String ip = getUserIP(request);
if (ip != null)
{
ip = ip.substring(ip.lastIndexOf('.') + 1);
} else
{
ip = "0";
}
return ip;
}
5、获取服务器的会后一个地址段,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getLastServerIpSegment
* <ul>
* @description 获取服务器的会后一个地址段
* </ul>
* @createdTime 2017年12月30日 下午7:44:21
* @return String
*
* @version : V1.0.0
*/
public static String getLastServerIpSegment()
{
String ip = getServerIP();
if (ip != null)
{
ip = ip.substring(ip.lastIndexOf('.') + 1);
} else
{
ip = "0";
}
return ip;
}
6、 验证IP地址是否符合规则,通过正则表达实现,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title isValidIP
* <ul>
* @description 验证IP地址是否符合规则
* </ul>
* @createdTime 2017年12月30日 下午6:49:21
* @param ip
* @return boolean
*
* @version : V1.0.0
*/
public static boolean isValidIP(String ip)
{
if (StringUtils.isEmpty(ip))
{
return false;
}
Matcher matcher = pattern.matcher(ip);
boolean isValid = matcher.matches();
return isValid;
}
7、获取IP地址,代码段实例如下:
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getIpAddress
* <ul>
* @description
* <li>获取IP地址
* <li><strong>注意:</strong>IP地址经过多次反向代理后会有多个IP值,
* <li>其中第一个IP才是真实IP,所以不能通过request.getRemoteAddr()获取IP地址,
* <li>如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
* <li>X-Forwarded-For中第一个非unknown的有效IP才是用户真实IP地址。
* </ul>
* @createdTime 2017年12月30日 下午7:52:35
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getIpAddress(HttpServletRequest request)
{
String ip = null;
try
{
// 获取用户真是的地址
String Xip = request.getHeader("X-Real-IP");
// 获取多次代理后的IP字符串值
String XFor = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor))
{
// 多次反向代理后会有多个IP值,第一个用户真实的IP地址
int index = XFor.indexOf(",");
if (index >= 0)
{
return XFor.substring(0, index);
} else
{
return XFor;
}
}
ip = Xip;
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
} catch (Exception e)
{
e.printStackTrace();
}
return ip;
}
参数说明:
X-Real-IP | nginx 代理服务器IP |
X-Forwarded-For | squid 代理服务器IP |
Proxy-Client-IP | apache 代理服务器IP |
WL-Proxy-Client-IP | weblogic 代理服务器IP |
HTTP_CLIENT_IP | http 客户端IP |
HTTP_X_FORWARDED_FOR | http 代理服务器IP |
完整代码实例
Java通过HttpServletRequest获取用户IP地址完成代码实例,如下:
package com.b2c.microservice.common.utils;
import org.apache.commons.lang.StringUtils;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* <ul>
* @description TODO
* </ul>
* @className IpUtil
* @package com.b2c.microservice.common.utils
* @createdTime 2017年12月30日 下午6:35:00
*
* @version V1.0.0
*/
public class IpUtil
{
/**
* 默认IP地址
*/
public final static String ERROR_IP = "127.0.0.1";
/**
* IP地址正则表达式
*/
public final static Pattern pattern = Pattern.compile(
"(2[5][0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})");
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title isValidIP
* <ul>
* @description 根据请求验证IP地址
* </ul>
* @createdTime 2017年12月30日 下午7:38:19
* @param request
* @return boolean
*
* @version : V1.0.0
*/
public static boolean isValidIP(HttpServletRequest request)
{
// 获取用户真实的IP地址
String ip = getUserIP(request);
// 验证IP地址是否符合规则
return isValidIP(ip);
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getRemoteIp
* <ul>
* @description 获取远程IP地址
* </ul>
* @createdTime 2017年12月30日 下午6:39:22
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getRemoteIp(HttpServletRequest request)
{
String ip = request.getHeader("x-real-ip");
if (ip == null)
{
ip = request.getRemoteAddr();
}
// 过滤反向代理的ip
String[] stemps = ip.split(",");
if (stemps != null && stemps.length >= 1)
{
// 得到第一个IP,即客户端真实IP
ip = stemps[0];
}
ip = ip.trim();
if (ip.length() > 23)
{
ip = ip.substring(0, 23);
}
return ip;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getUserIP
* <ul>
* @description 获取用户真实的IP地址
* </ul>
* @createdTime 2017年12月30日 下午6:42:17
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getUserIP(HttpServletRequest request)
{
// 优先取 X-Real-IP
String ip = request.getHeader("X-Real-IP");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("x-forwarded-for");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
if ("0:0:0:0:0:0:0:1".equals(ip))
{
ip = ERROR_IP;
}
}
if ("unknown".equalsIgnoreCase(ip))
{
ip = ERROR_IP;
return ip;
}
int index = ip.indexOf(',');
if (index >= 0)
{
ip = ip.substring(0, index);
}
return ip;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getLastIpSegment
* <ul>
* @description 获取末尾IP地址段,{@linkplain IP地址简介}
* </ul>
* @createdTime 2017年12月30日 下午6:44:09
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getLastIpSegment(HttpServletRequest request)
{
// 获取用户真实的IP地址
String ip = getUserIP(request);
if (ip != null)
{
ip = ip.substring(ip.lastIndexOf('.') + 1);
} else
{
ip = "0";
}
return ip;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title isValidIP
* <ul>
* @description 验证IP地址是否符合规则
* </ul>
* @createdTime 2017年12月30日 下午6:49:21
* @param ip
* @return boolean
*
* @version : V1.0.0
*/
public static boolean isValidIP(String ip)
{
if (StringUtils.isEmpty(ip))
{
return false;
}
Matcher matcher = pattern.matcher(ip);
boolean isValid = matcher.matches();
return isValid;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getLastServerIpSegment
* <ul>
* @description 获取服务器的会后一个地址段
* </ul>
* @createdTime 2017年12月30日 下午7:44:21
* @return String
*
* @version : V1.0.0
*/
public static String getLastServerIpSegment()
{
String ip = getServerIP();
if (ip != null)
{
ip = ip.substring(ip.lastIndexOf('.') + 1);
} else
{
ip = "0";
}
return ip;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getServerIP
* <ul>
* @description 获取服务器IP地址
* </ul>
* @createdTime 2017年12月30日 下午7:44:16
* @return String
*
* @version : V1.0.0
*/
public static String getServerIP()
{
InetAddress inetAddress;
try
{
inetAddress = InetAddress.getLocalHost();
String hostAddress = inetAddress.getHostAddress();
return hostAddress;
} catch (UnknownHostException e)
{
e.printStackTrace();
}
return ERROR_IP;
}
/**
*
* @author HuaZai
* @contact who.seek.me@java98k.vip
* @title getIpAddress
* <ul>
* @description
* <li>获取IP地址
* <li><strong>注意:</strong>IP地址经过多次反向代理后会有多个IP值,
* <li>其中第一个IP才是真实IP,所以不能通过request.getRemoteAddr()获取IP地址,
* <li>如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
* <li>X-Forwarded-For中第一个非unknown的有效IP才是用户真实IP地址。
* </ul>
* @createdTime 2017年12月30日 下午7:52:35
* @param request
* @return String
*
* @version : V1.0.0
*/
public static String getIpAddress(HttpServletRequest request)
{
String ip = null;
try
{
// 获取用户真是的地址
String Xip = request.getHeader("X-Real-IP");
// 获取多次代理后的IP字符串值
String XFor = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor))
{
// 多次反向代理后会有多个IP值,第一个用户真实的IP地址
int index = XFor.indexOf(",");
if (index >= 0)
{
return XFor.substring(0, index);
} else
{
return XFor;
}
}
ip = Xip;
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
} catch (Exception e)
{
e.printStackTrace();
}
return ip;
}
}
*补充:关于正则表达式匹配ip地址,实际上就是分别判断每个点直接的数字是否符合规范
好了,关于Java通过HttpServletRequest获取用户IP地址代码实例 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。
作 者: | 华 仔 |
联系作者: | who.seek.me@java98k.vip |
来 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/85407888 |
版权声明: | 本文为博主原创文章,请在转载时务必注明博文出处! |