ERROR [http-nio-53313-exec-29][WebSessionStat.java:265] - session ip change too many

目錄

一、問題描述:

二、解決方法:

三、問題原因:


一、問題描述:

最近的項目,在上線之後,出現大量的錯誤日誌提示,不斷打印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)的原因及不完整解決辦法。

發佈了104 篇原創文章 · 獲贊 138 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章