1. 程式人生 > 其它 >部署springboot專案到公網伺服器 出現session ip change too many的解決辦法

部署springboot專案到公網伺服器 出現session ip change too many的解決辦法

最近將專案放到公網,在登入頁面點選幾次後,出現了大量的[ERROR] session ip change too many 的error日誌,頁面也像失效了一樣,沒有反應;
在這裡插入圖片描述
仔細看是阿里巴巴的druid元件報的錯,於是找到 WebSessionStat類,原來是druid監控session時,記錄訪問IP提示的。

public void addRemoteAddress(String ip) {
    if (remoteAddresses == null) {
        this.remoteAddresses = ip;
        return;
    }
    if (remoteAddresses.contains(ip)) {
        return;
    }
    if (remoteAddresses.length() > 256) {
        LOG.error("session ip change too many");
        return;
    }
    remoteAddresses += ';' + ip;
}
看原始碼這一段,就是報錯的來源:  
	LOG.error("session ip change too many");
	再看條件 if (remoteAddresses.length() > 256)
	

可以看到,druid獲得ip的方法是request.getHeader(“x-forwarded-for”);,這個方法會獲取到ip:port,而國內由於公網IP極其匱乏,導致絕大部分人上網都是通過地址對映以後來上網,這就導致了每次請求的ip、埠都可能不一樣,那麼自然會被WebSessionStat.addRemoteAddress()方法累加到remoteAddresses,導致remoteAddresses越來越長,最終超過256位長度,觸發LOG.error(“session ip change too many”)語句。

所以解決辦法:
1 修改原始碼, 把 LOG.error(“session ip change too many”)註釋掉;不過這個方法不夠靈活,也比較麻煩;改反編譯檔案自行百度
2 修改配置檔案,因為我的是spring boot專案,所以直接再yml檔案,找到資料來源配置;

druid:
	filter:
	  config:
 	 	enabled: false
    web-stat-filter:
	  enabled: false
	stat-view-servlet:
	  enabled: false

如果你的配置使用的是xml檔案的話,同理在你的xml中關掉session監控即可;

最後,重啟專案,多點選幾次,發出請求,如果頁面穩定執行,說明成功解決