目录
一、问题描述:
最近的项目,在上线之后,出现大量的错误日志提示,不断打印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)的原因及不完整解决办法。