1. 程式人生 > >阿里雲X-Forwarded-For 發現tomcat記錄的日誌全部來自於SLB轉發的IP地址,不能獲取到請求的真實IP。

阿里雲X-Forwarded-For 發現tomcat記錄的日誌全部來自於SLB轉發的IP地址,不能獲取到請求的真實IP。

1、背景:阿里雲的SLB的負載均衡,在tomcat中獲取不到真實IP,而是阿里的內網IP,SLB中倆臺或者3臺本身是區域網,這裡是SLB原理,可以看看,沒怎麼看懂,呵呵,要細細讀下。

2、需要開啟tomcat的X-Forwarded-For,在tomcat/conf/server.xml中有一個如下的AccessLogValve 日誌紀錄功能,當配置中的pattern=common時,對應的日誌是如下,無論正常請求和非法請求都會記錄。

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern='commont' resolveHosts="false"/>

3、修改pattern為pattern='%{X-Forwarded-For}i %h %l %u %t "%r" %s %b',則會記錄headers頭中的X-Forwarded-For資訊,可以使用fiddle抓取到X-Forwarded-For資訊

4、獲取tomcat中的X-Forwarded-For,前提阿里雲需要開啟獲取真實IP如下圖:


5、Java程式碼獲取X-Forwarded-For

	/**
	 * 獲取ip地址,防止叢集、代理
	 * @param request 
	 * @return ip
	 */
	public static String getAddr(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}