X-Forwarded-For 跟 X-Real-IP 的区别

X-Forwarded-For 和 X-Real-IP 的区别?
        X-Forwarded-For 和 X-Real-IP 的区及获取客户端的ip?

一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中

来自4.4.4.4的一个请求,header包含这样一行

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理

而X-Real-IP,一般只记录真实发出请求的客户端IP,上面的例子,如果配置了X-Read-IP,将会是

X-Real-IP: 1.1.1.1
所以 ,如果只有一层代理,这两个头的值就是一样的


第一种
  /**
      * 从Request对象中获得客户端IP,处理了HTTP代理服务器和Nginx的反向代理截取了ip
      * @param request
      * @return ip
      */
    public static String getLocalIp(HttpServletRequest request) {
        String remoteAddr = request.getRemoteAddr();
        String forwarded = request.getHeader("X-Forwarded-For");
        String realIp = request.getHeader("X-Real-IP");

        String ip = null;
        if (realIp == null) {
            if (forwarded == null) {
                ip = remoteAddr;
            } else {
                ip = remoteAddr + "/" + forwarded.split(",")[0];
            }
        } else {
            if (realIp.equals(forwarded)) {
                ip = realIp;
            } else {
                if(forwarded != null){
                    forwarded = forwarded.split(",")[0];
                }
                ip = realIp + "/" + forwarded;
            }
        }
        return ip;
    }

第二种
public static String getIp(HttpServletRequest request) {
         String remoteAddr = request.getRemoteAddr();
          String forwarded = request.getHeader("X-Forwarded-For");
          String realIp = request.getHeader("X-Real-IP");
  
          String ip = null;
          if (realIp == null) {
              if (forwarded == null) {
                  ip = remoteAddr;
             } else {
                 ip = remoteAddr + "/" + forwarded;
             }
         } else {
             if (realIp.equals(forwarded)) {
                 ip = realIp;
             } else {
                 ip = realIp + "/" + forwarded.replaceAll(", " + realIp, "");
             }
         }
         return ip;
     }

第三种
   public static String getIp2(HttpServletRequest request) {
             String ip = request.getHeader("X-Forwarded-For");
             if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
                 //多次反向代理后会有多个ip值,第一个ip才是真实ip
                 int index = ip.indexOf(",");
                 if(index != -1){
                     return ip.substring(0,index);
                 }else{
                     return ip;
                }
            }
            ip = request.getHeader("X-Real-IP");
            if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
                return ip;
            }
            return request.getRemoteAddr();
       }