/**
* 獲取用戶真實IP地址,如果通過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP值,
* 取X-Forwarded-For中第一個非unknown的有效IP字符串。
* 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,
* 192.168.1.100
*
* 用戶真實IP爲: 192.168.1.110
*
* @param request
* @return
*/
public static String getIpAddress(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = (String) ips[index];
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}
驗證IP格式
/**通過originalIP 校驗ip是否有效 <br>
* 正確originalIP 可能的格式,如:<br>
* 10.2.0.1 <br>
* 10.2.0.* <br>
* 10.2.*.*<br>
* 10.*.*.*<br>
* *.*.*.*<br>
* ip 的格式一定爲10.2.0.2
* */
public static Boolean validIp(String originalIP,String ip){
if (!StringUtils.hasText(originalIP)) {
return true;
}
originalIP = originalIP.trim();
if (!StringUtils.hasText(ip)) {
return false;
}
ip = ip.trim();
String ipReg = "^((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])|\\*)\\."
+ "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)\\."
+ "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)\\."
+ "((1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)|\\*)$";
/**校驗ip的格式*/
Pattern pattern = Pattern.compile(ipReg);
Matcher ipMatcher = pattern.matcher(ip);
if (!ipMatcher.matches()) {
return false;
}
/**校驗originalIP 的格式*/
Pattern oriPattern = Pattern.compile(ipReg);
Matcher oriMatcher = oriPattern.matcher(originalIP);
if (!oriMatcher.matches()) {
return false;
}
/**originalIP與ip 相同*/
if(originalIP.equals(ip)){
return true;
}
/**校驗ip是否處在originalIP段內*/
String[] oriIpArr = originalIP.split("\\.");
String[] ipArr = ip.split("\\.");
Boolean hasStar=false;
String star="*";
for(int i=0;i<oriIpArr.length;i++){
String oriIp = oriIpArr[i];
boolean flag = oriIp.equals(star) ;
if(flag){
hasStar=flag;
}
if(hasStar && !flag){
return false;
}
if(!ipArr[i].equals(oriIp) && !oriIp.equals(star)){
return false;
}
}
return true;
}