分享

JAVA获取真实IP的方法

 跃来跃去 2008-11-17
   /**
       * 获取真实IP
       * @param request
       * @return
       */
      public static String getRealIp(HttpServletRequest request){
     /* 目前网上流行的所谓“取真实IP地址”的方法,都有bug,没有考虑到多层透明代理的情况。
     多数代码类似:
     string IpAddress = (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]!=null
     && HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] !=String.Empty)
     HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
     :HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
     事实上,上面的代码只试用与用户只使用了1层代理,如果用户有2层,3层HTTP_X_FORWARDED_FOR 的值是:“本机真实IP,1层代理IP,2层代理IP,.....” ,
     如果这个时候你的数据中保存IP字段的长度很小(15个字节),数据库就报错了。
     所以取“真正”IP地址的方式,还应该判断 “HTTP_X_FORWARDED_FOR” 中是否有“,”逗号,或者长度是否超长(超过15字节 xxx.xxx.xxx.xxx)。
     */
     String result = request.getHeader("x-forwarded-for");
     if(result!=null&&result.trim().length()>0) {
     //可能有代理
     if(result.indexOf(".")==-1){
     //没有“.”肯定是非IPv4格式
     result = null;
     } else {
     if(result.indexOf(",")!=-1){
     //有“,”,估计多个代理。取第一个不是内网的IP。
     result = result.trim().replace("'","");
     String[] temparyip = result.split(",");
     for(int i=0;i<temparyip.length;i++){
     if(isIPAddress(temparyip[i])
     && temparyip[i].substring(0,3)!="10."
     && temparyip[i].substring(0,7)!="192.168"
     && temparyip[i].substring(0,7)!="172.16."){
     return temparyip[i]; //找到不是内网的地址
     }
     }
     }else if(isIPAddress(result)) {//代理即是IP格式
     return result;
     }else{
     result = null; //代理中的内容 非IP,取IP
     }
     }
     }
    
     if (result== null || result.trim().length()==0){
     result = request.getHeader("Proxy-Client-IP");
     }
     if (result== null || result.trim().length()==0){
     result = request.getRemoteAddr();
     }
     return result;
    }
      /**
      * 判断是否是IP地址格式
      * @param str1
      * @return
      */
     public static boolean isIPAddress(String str1) {
//     if(str1==null||str1.trim().length()<7||str1.trim().length()>15){
//     return false;
//     }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约