最近将项目放到公网,在登录页面点击几次后,出现了大量的[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文件,找到数据源配置spring.datasource,往后面加上关闭druid的监控配置;
druid:
filter:
config:
enabled: false
web-stat-filter:
enabled: false
stat-view-servlet:
enabled: false
如果你的配置使用的是xml文件的话,同理在你的xml中关掉session监控即可;
然后实在不行的话再把 此Bean注释掉:ServletRegistrationBean;
还不行的话,最后办法是找到 springcloud配置文件,去微服务配置里把到期时加大就好了