nginx作反向代理負載均衡 Java怎麼獲取後端服務器獲取用戶IP

nginx作反向負載均衡,後端服務器獲取真實客戶端ip

首先,在前端nginx上須要作以下配置:前端

location /nginx

proxy_set_hearder host                $host;後端

proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;服務器

proxy_set_header X-real-ip           $remote_addr;負載均衡

};ui

nginx會在把請求轉向後臺real-server前把http報頭中的ip地址進行替換;這樣操做完成後,real-server也須要作一些操做;spa

 

public class ClientIPUtils {
 /**
  * 在不少應用下均可能有須要將用戶的真實IP記錄下來,這時就要得到用戶的真實IP地址,在JSP裏,獲取客戶端的IP地
  * 址的方法是:request.getRemoteAddr(),這種方法在大部分狀況下都是有效的。可是在經過了Apache,Squid等
  * 反向代理軟件就不能獲取到客戶端的真實IP地址了。
  * 可是在轉發請求的HTTP頭信息中,增長了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址。
  * @param request
  * @return
  */debug

public static String getClientIp(HttpServletRequest request) {代理

           String ip = request.getHeader("x-forwarded-for");server

     //String ip = request.getHeader("X-real-ip");

            logger.debug("x-forwarded-for = {}", ip);
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("Proxy-Client-IP"); 
               logger.debug("Proxy-Client-IP = {}", ip); 
           }
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getHeader("WL-Proxy-Client-IP");
               logger.debug("WL-Proxy-Client-IP = {}", ip);
           }
           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
               ip = request.getRemoteAddr();
               logger.debug("RemoteAddr-IP = {}", ip); 
           }
           if(StringUtils.isNotBlank(ip)) {
               ip = ip.split(",")[0];
           }
           return ip;

       }

}

相關文章
相關標籤/搜索