背景:一年多以前本人做了一个管理系统,采用 Forms 身份验证的方式,当时系统不大,我采用了一个可序列化的对象记录了用户的用户名、ID ,用户节点ID 等信息将其序列化为一个字符串后存入到 cookie 中,这样做运行的一直良好。随着时间的推移,各个应用后台都逐步加入到了这个系统中也相安无事。前段时间我又在这个系统里加入了一个应用并将一个节点分配给我自己后做完测试就没再去理会了。前段时间因要上这个系统处理问题,始终无法登录上去。今天有空调试一下这个系统,将查找Bug的过程记录下来,以方便后来人。
现象:有部分帐号可以正常登录,有部分帐号不能登录。
通过 HttpFox 跟踪分析,能正常登录的帐号在登录后 HttpFox 显示 Cookie 正常;而不能登录的用户名在登录后跳转到目标页前 Cookie 有,到目标页后 Cookie 诡异地消失了。最初我怀疑是浏览器问题(IE6),后来在其他的机器上试,所有浏览器都会有这个症状。通过不断的F5发现,用不同的用户名登录序列化对象为字符串长度有别外无其他不同。
解决方法:
在 google+baidu 无果后,我只能怀疑是帐号的问题无其他方法,解决问题陷入僵局。同事不经意的一句提示说好像 cookie 有长度限制,我蓦然发现,不能登录的帐号序列化后的cookie有 5000 多个字符,能登录的不到2000个字符。至此才定位问题所在:这是以前的一个设计缺陷,就是将庞大的节点信息存入到 cookie 中了,导致系列化后的字符串过长。而在整个系统中只有加载节点树的时候才用到这个信息,故将这个记录节点信息的属性移除,对整个登录做一些变动,去掉待序列化的对象中不必要的一些信息后,所有的帐号都能正常登录了。