package com.juchen.utils; import javax.servlet.http.HttpServletRequest; /** * ip 相关的工具方法 */ public class IpUtil { /* *//** * 根据request获取用户的IP地址 * @param request * @return */ public static String getRemoteHost(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); 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.getRemoteAddr(); } return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip; } /** * * @param request * @return 192.168.1.121 192.168.1.121,192.168.1.122 */ public static String getIpAddress(HttpServletRequest request){ // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 String ip = "192.168.0.1"; try { ip = request.getHeader("X-Forwarded-For"); 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.getHeader("X-Real-IP"); } //如果没有代理,则获取真实ip if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } if(ip.equals("0:0:0:0:0:0:0:1")){ ip = "127.0.0.1"; } } catch (Exception e) { ip = "192.168.0.1"; } return ip; } /* * 验证IP是否属于某个IP段 * * * * ipSection IP段(以'-'分隔) * * ip 所验证的IP号码 * * * */ public static boolean ipExistsInRange(String ip, String ipSection) { ipSection = ipSection.trim(); ip = ip.trim(); int idx = ipSection.indexOf('-'); String beginIP = ipSection.substring(0, idx); String endIP = ipSection.substring(idx + 1); return getIp2long(beginIP) <= getIp2long(ip) && getIp2long(ip) <= getIp2long(endIP); } public static long getIp2long(String ip) { ip = ip.trim(); String[] ips = ip.split("\."); long ip2long = 0L; for (int i = 0; i < 4; ++i) { ip2long = ip2long << 8 | Integer.parseInt(ips[i]); } return ip2long; } public static long getIp2long2(String ip) { ip = ip.trim(); String[] ips = ip.split("\."); long ip1 = Integer.parseInt(ips[0]); long ip2 = Integer.parseInt(ips[1]); long ip3 = Integer.parseInt(ips[2]); long ip4 = Integer.parseInt(ips[3]); long ip2long = 1L * ip1 * 256 * 256 * 256 + ip2 * 256 * 256 + ip3 * 256 + ip4; return ip2long; } public static void main(String[] args){ //10.10.10.116 是否属于固定格式的IP段10.10.1.00-10.10.255.255 String ip="10.8.12.255"; String ipSection="10.1.1.00-10.10.10.250"; boolean exists=ipExistsInRange(ip,ipSection); System.out.println(exists); System.out.println(getIp2long(ip)); System.out.println(getIp2long2(ip)); } }
自己的业务是支持多个单个ip和多个ip段 例如 192.168.0.1-192.168.0.100,10.10.10.1-10.10.10.100;170.20.20.100
public static void main(String[] args) { String ip = "192.168.10.10,255.168.100.255;192.168.0.1-192.168.3.100,192.168.5.1-192.168.5.100"; String remoteHost = "192.168.255.88,192.168.10.11"; checkIp(ip, remoteHost); } /** * * @param ip 用户填写可以通过的ip或ip段(可能存在多个或两种都存在) * @param remoteHost 这个是抓取到的ip (可能存在多个) * @return */ public static boolean checkIp(String ip, String remoteHost) { // IP地址校验 boolean flag = false; if (!StringUtil.isEmpty(ip)) { String[] remoteHostList = remoteHost.split(","); // 新增短信ip段的效验 String[] ipArry = ip.split(";"); for (int i = 0; i < remoteHostList.length; i++) { if (DateConfig.server_ip.indexOf(remoteHostList[i].trim()) > -1) { flag = true; break; } else { if (ip.indexOf(remoteHostList[i].trim()) > -1) { flag = true; break; } // 判断ip段 for (String ipStr : ipArry) { if (ipStr.indexOf("-") != -1) { // 包含ip段 String[] ipSegent = ipStr.split(","); for (String strs : ipSegent) { // str 192.168.0.1 -192.168.0.100 boolean ipfalg = IpUtil.ipExistsInRange(remoteHostList[i].trim(), strs.trim()); if (ipfalg) { flag = true; break; } } } } } } if (!flag) { System.out.println("ip效验不通过"); }else{ System.out.println("ip效验通过"); } } return flag; }
上面效验ip是否在ip段的短发里面转载自:https://blog.csdn.net/qq_14918243/article/details/51452489