部署springboot專案到公網伺服器 出現session ip change too many的解決辦法
阿新 • • 發佈:2021-01-20
最近將專案放到公網,在登入頁面點選幾次後,出現了大量的[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監控即可;