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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

No8g攻城狮

向每一个努力改变现状的你致敬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值