WebUtil.getIp(request)问题:nginx代理地址后获得ip都是为127.0.0.1,下面是改造之后的。

Blade 未结 2 2669
皮蛋掠夺者
皮蛋掠夺者 2019-05-12 07:32
@Nullable
public static String getIP(@Nullable HttpServletRequest request) {

   String Xip = request.getHeader("X-Real-IP");
   String XFor = request.getHeader("X-Forwarded-For");
   if(StringUtil.isNotBlank(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
      //多次反向代理后会有多个ip值,第一个ip才是真实ip
      int index = XFor.indexOf(",");
      if(index != -1){
         return XFor.substring(0,index);
      }else{
         return XFor;
      }
   }
   XFor = Xip;
   if(StringUtil.isNotBlank(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
      return XFor;
   }
   if (StringUtil.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("Proxy-Client-IP");
   }
   if (StringUtil.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("WL-Proxy-Client-IP");
   }
   if (StringUtil.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("HTTP_CLIENT_IP");
   }
   if (StringUtil.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
   }
   if (StringUtil.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
      XFor = request.getRemoteAddr();
   }

   if(StringUtil.isBlank(XFor)) {
      if (request == null) {
         return StringPool.EMPTY;
      }
      String ip = null;
      for (String ipHeader : IP_HEADER_NAMES) {
         ip = request.getHeader(ipHeader);
         if (IP_PREDICATE.test(ip)) {
            break;
         }
      }
      if (IP_PREDICATE.test(ip)) {
         ip = request.getRemoteAddr();
      }
      return StringUtil.isBlank(ip) ? null : StringUtil.splitTrim(ip, StringPool.COMMA)[0];
   }
   return XFor;
}


2条回答
  •  258694298
    258694298 (楼主)
    2024-09-26 14:28

    现在3.1的版本,还是同样的问题,日志记录中remote_ip还是 127.0.0.1;这个bug一直没有修复吗?

    作者追问:2024-09-26 14:28

    最新版已经修复了,可以看线上的演示

    CleanShot20240926144238@2x.png

    CleanShot20240926144313@2x.png

提交回复