zoukankan      html  css  js  c++  java
  • ERROR [http-nio-53313-exec-29][WebSessionStat.java:265]

    目录

    一、问题描述:

    二、解决方法:

    三、问题原因:


    一、问题描述:

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

  • 相关阅读:
    mybatis-plus物理分页插件使用
    mybatis-plus提供支持ActiveRecord模式
    mybatis-plus通用Service
    mybatis-plus返回查询总记录数
    Mybatis-Plus查询返回Map类型数据
    Mybatis-Plus条件构造器condition动态判断条件
    Mybatis-Plus条件构造器select方法返回指定字段
    mybatis-plus条件构造器UpdateWrapper实例
    mybatis-plus条件构造器QueryWrapper实例
    这玩意比ThreadLocal叼多了,吓得why哥赶紧分享出来。
  • 原文地址:https://www.cnblogs.com/no8g/p/13415559.html
Copyright © 2011-2022 走看看