C#的HttpModule中及Java的Servlet中成员变量乱用导致的不易重现的BUG
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
最新文章
- HTML基本知识
- 服务发现:Zookeeper vs etcd vs Consul
- MySQL(18):Select- subquery子查询
- git版本号管理工具的上手
- 学习Swift -- 协议(下)
- Create Table DDL sample(TSQL)
- 基于搜狗搜索的微信公众号爬虫实现(C#版本)
- mysq开启慢查询
- 201621123040《Java程序设计》第2周学习总结
- java基础语法(三大基础)
- 机器视觉:MobileNet 和 ShuffleNet
- UnicodeDecodeError: 'ascii' codec can't decode byte 0x9c in position 1: ordinal not in range(128)
- C# Newtonsoft.Json反序列化为dynamic对象之后的使用
- Java byte类型转换成int类型时需要 &; 0XFF的原因
- 【python3】 django2.0 在生成数据库表时报错: TypeError: __init__() missing 1 required positional argument: 'on_delete'
- Microsoft Security Essentials
- 20165320 实验一 java环境的熟悉
- 每天一个linux命令-vi
- HDUOJ------敌兵布阵
- 学习Mysql的记录贴 记录的内容是 指令的试用
热门文章
- KindEditor配置和使用
- python--终端工具之subprocess
- javaweb利用javabean将数据库中内容遍历在页面输出
- centos6/7 下升级openssl并安装python3
- mssql格式化工具——SQL PRETTY PRINTER
- C语言 switch
- Codeforces Round #616 (Div. 2) C. Mind Control
- SVN之TortoiseSVN使用02
- C#之Quartz任务调度的使用(2.2.3.400)
- 如何通过给MM修电脑培养感情