ip效验和ip段的效验

 
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

 

posted @ 2019-06-26 14:34  __Ant  阅读(812)  评论(0编辑  收藏  举报