目錄
一、問題描述:
最近的項目,在上線之後,出現大量的錯誤日誌提示,不斷打印error級別的錯誤日誌;
2019-12-12 20:15:46.544 ERROR [http-nio-53313-exec-29][WebSessionStat.java:265] - session ip change too many
可以查看如下截圖:
根據錯誤提示查看WebSessionStat類,這個類是alibaba druid的,但是不影響程序的運行,這只是druid監控session時,用於記錄訪問IP的。druid會監控session,記錄訪問者的ip並作出提示。
二、解決方法:
方法一:關閉druid的session監控。
在web.xml配置druid的地方,將sessionStatEnable設爲false即可,如下:
<init-param>
<param-name>sessionStatEnable</param-name>
<param-value>false</param-value>
</init-param>
方法二:修改druid配置文件
session-stat-enable: false
即關閉druid對session的監控。
方法三:修改druid的源碼
下載或反編譯druid的源碼,將LOG.error("session ip change too many");註釋掉,或者將if條件裏的remoteAddresses.length() > 256長度改大也可以。或者等阿里巴巴官方修復這個問題。
三、問題原因:
打開druid的源代碼,找到com.alibaba.druid.support.http.stat.WebSessionStat類,可以看到輸出錯誤的源代碼
package com.alibaba.druid.support.http.stat;
public class WebSessionStat {
*****
*****
public void addRemoteAddress(String ip) {
if (this.remoteAddresses == null) {
this.remoteAddresses = ip;
} else if (!this.remoteAddresses.contains(ip)) {
if (this.remoteAddresses.length() > 256) {
LOG.error("session ip change too many");
} else {
this.remoteAddresses = this.remoteAddresses + ';' + ip;
}
}
}
*****
*****
}
這是阿里Druid連接池的session監控功能,會記錄同一個會話ID的所有訪問IP記錄,當超過256個字符長度時就會打印這個錯誤日誌,但實際功能不受影響。
找到session監控的頁面,看到同一個會話請求次數並不多,但記錄的IP卻有問題,一個請求最多的會保存多級代理形成的多段
IP(如192.168.1.2,192.168.1.3,192.168.1.4),這樣一來多次請求就會使訪問的IP長度,通過this.remoteAddresses =
this.remoteAddresses + ';' + ip;累加就會超出256長度從而打印這個錯誤。
而IP的獲取方式是通過阿里的com.alibaba.druid.util.DruidWebUtils工具類;源碼如下:
package com.alibaba.druid.util;
public class DruidWebUtils {
public DruidWebUtils() {
}
public static String getRemoteAddr(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;
}
****
****
}
參考文檔:
1、注意:阿里Druid連接池監控的兩個坑;
2、配置_配置WebStatFilter;
3、session ip change too many;
4、[ERROR] session ip change too many (WebSessionStat.java:266)的原因及不完整解決辦法。