從request請求頭獲得請求使用者的IP與IP驗證
阿新 • • 發佈:2019-01-03
/** * 獲取使用者真實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; }