获取当前访问客户端的真实IP地址,辨别是否为内网?

来源:互联网 发布:智商和情商 知乎 编辑:程序博客网 时间:2024/06/12 01:27

Test.jsp  测试页面

 

TestAddress tsetadres = new TestAddress();

String addIP = request.getRemoteAddr();

 if(!addIP.equals(""))
 {
  String relIp = tsetadres.getIpAddr(request);
  boolean isTrue = tsetadres.isInnerIP(relIp);
  if(isTrue == true)
  {
   //内网
  ......

  }
  else
  {
   //外网
  ........

  }
 }

 

 

TestAddress.java  测试类

 

public class TestAddres {

 

//获取客户端真实的IP
 public String getIpAddr(HttpServletRequest request) {  
     String ip = request.getHeader("x-forwarded-for");  
     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)   
                   || "null".equalsIgnoreCase(ip))    {  
         ip = request.getHeader("Proxy-Client-IP");  
     }  
     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)   
                   || "null".equalsIgnoreCase(ip)) {  
         ip = request.getHeader("WL-Proxy-Client-IP");  
     }  
     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)   
                   || "null".equalsIgnoreCase(ip)) {  
         ip = request.getRemoteAddr();  
     }  
     return ip;  
 }

 

//判断客户端IP地址是否为内网地址
 public  boolean isInnerIP(String ipAddress){   
        boolean isInnerIp = false;   
        long ipNum = getIpNum(ipAddress);   
        /**  
        私有IP:

               A类  10.0.0.0-10.255.255.255  
               B类  172.16.0.0-172.31.255.255  
               C类  192.168.0.0-192.168.255.255  
        **/  
        long aBegin = getIpNum("10.0.0.0");   
        long aEnd = getIpNum("10.255.255.255");   
        long bBegin = getIpNum("172.16.0.0");   
        long bEnd = getIpNum("172.31.255.255");   
        long cBegin = getIpNum("192.168.0.0");   
        long cEnd = getIpNum("192.168.255.255");   
        isInnerIp = isInner(ipNum,aBegin,aEnd) || isInner(ipNum,bBegin,bEnd) || isInner(ipNum,cBegin,cEnd) || ipAddress.equals("127.0.0.1");   //访问本地localhost获取为127.0.0.1
        return isInnerIp;              
 }  

 private static long getIpNum(String ipAddress) {   
     String [] ip = ipAddress.split("//.");   
     long a = Integer.parseInt(ip[0]);   
     long b = Integer.parseInt(ip[1]);   
     long c = Integer.parseInt(ip[2]);   
     long d = Integer.parseInt(ip[3]);   
   
     long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;   
     return ipNum;   
 }  

 private static boolean isInner(long userIp,long begin,long end){   
      return (userIp>=begin) && (userIp<=end);   
 }

}

 

原创粉丝点击