3年前写的在HttpModule中记录访问日志的代码,在最近使用日志数据分析登录账号的IP情况时,才发现了一个不易重现的BUG——日志中记录的登录账号出现串掉的情况。之所以这个时候才发现该问题,是因为部分用户的IP是固定的,但是日志里却出现了别人的IP。而之所以3年后才发现,是因为这块日志数据一直没怎么用过。回头想想,根本原因还是在用成员变量的时候没考虑到多线程的情况,或者说多用户同时访问的情况。因为HttpModule里的事件,是所有页面实例共用的。

问题代码:

        string dateBeginRequest;//开始请求时间
string userName;//用户名 public void Init(HttpApplication application)
{
application.AcquireRequestState += (new EventHandler(this.Application_AcquireRequestState));
application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
application.EndRequest += (new EventHandler(this.Application_EndRequest));
}

实现System.Web.IHttpModule的类中,有两个导致BUG的字符串成员变量。其中字符串成员变量dateBeginRequest在Application_BeginRequest事件方法中赋值,字符串成员变量userName在AcquireRequestState 事件方法中赋值,值来源于Session。当在本地调试时很难重现用户A的账号记录到用户B的日志数据中,这种情况。但是当生产环境有一定的并发请求的时候,就会出现用户A的账号记录到用户B的日志数据中,日志数据中请求开始时间这个字段也会出现同样的问题。

解决办法就是把这部分记录请求日志的代码,转移到各页面的基类中,因为各页面的后台类实例是独立的,互不影响。

上述问题在我们写的基于Servlet的Java开发框架中也出现了,解决办法是在方法内部创建对象实例,而不是使用类的成员变量来赋值再使用。之所以Servlet中成员变量也会出现该问题,是因为Servlet的service等方法也是所有映射到的请求都会进入该方法,存在并发的情况。

本文首发于我的CSDN博客:https://blog.csdn.net/n_ithero/article/details/104062423

最新文章

  1. HTML基本知识
  2. 服务发现:Zookeeper vs etcd vs Consul
  3. MySQL(18):Select- subquery子查询
  4. git版本号管理工具的上手
  5. 学习Swift -- 协议(下)
  6. Create Table DDL sample(TSQL)
  7. 基于搜狗搜索的微信公众号爬虫实现(C#版本)
  8. mysq开启慢查询
  9. 201621123040《Java程序设计》第2周学习总结
  10. java基础语法(三大基础)
  11. 机器视觉:MobileNet 和 ShuffleNet
  12. UnicodeDecodeError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128)
  13. C# Newtonsoft.Json反序列化为dynamic对象之后的使用
  14. Java byte类型转换成int类型时需要 & 0XFF的原因
  15. 【python3】 django2.0 在生成数据库表时报错: TypeError: __init__() missing 1 required positional argument: 'on_delete'
  16. Microsoft Security Essentials
  17. 20165320 实验一 java环境的熟悉
  18. 每天一个linux命令-vi
  19. HDUOJ------敌兵布阵
  20. 学习Mysql的记录贴 记录的内容是 指令的试用

热门文章

  1. KindEditor配置和使用
  2. python--终端工具之subprocess
  3. javaweb利用javabean将数据库中内容遍历在页面输出
  4. centos6/7 下升级openssl并安装python3
  5. mssql格式化工具——SQL PRETTY PRINTER
  6. C语言 switch
  7. Codeforces Round #616 (Div. 2) C. Mind Control
  8. SVN之TortoiseSVN使用02
  9. C#之Quartz任务调度的使用(2.2.3.400)
  10. 如何通过给MM修电脑培养感情