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)的原因及不完整解决办法。

posted @ 2019-12-14 12:49  No8g攻城狮  阅读(223)  评论(0编辑  收藏  举报