asp.net(c#)有关 Session 操作的几个误区
程序员文章站
2023-10-31 10:56:58
1. this.session["username"] = null httpsessionstate 内部使用&nbs...
1. this.session["username"] = null
httpsessionstate 内部使用 nameobjectcollection 类型的集合对象来存储用户数据。因此使用 this.session["username"] = null 仅仅是将该元素的值设为 null 而已,并没有真的将其从 session 中移除。(为什么?晕~~~ 建议看看 c# 基础方面的书。)
正确的方法是:this.session.remove("username");
删除全部数据:this.session.removeall(); 或 this.session.clear();
2. this.session.abandon()
该方法会导致当前 session 被取消,系统会触发 global.asax 中的 session_end 事件(仅限于 mode = inproc 时)。
尽管再次发出请求时 sessionid (可能)没有发生变化,但是你会发现 global.asax session_start 事件被触发。你还可以使用 this.session.isnewsession 属性来判断当前 session 是否重新创建的。
由于某些组件和控件可能要使用 session 信息(如使用 this.session.syncroot 进行同步),因此不要轻易使用该方法清理 session。
3. 用户身份验证
不要使用 this.session["username"] = "zhangsan" 、if (this.session["username"] != null) 这样的方式进行用户身份验证,这种方式既不安全也不合理。有关身份验证请参考 msdn 文档或雨痕写的相关文章。
httpsessionstate 内部使用 nameobjectcollection 类型的集合对象来存储用户数据。因此使用 this.session["username"] = null 仅仅是将该元素的值设为 null 而已,并没有真的将其从 session 中移除。(为什么?晕~~~ 建议看看 c# 基础方面的书。)
正确的方法是:this.session.remove("username");
删除全部数据:this.session.removeall(); 或 this.session.clear();
2. this.session.abandon()
该方法会导致当前 session 被取消,系统会触发 global.asax 中的 session_end 事件(仅限于 mode = inproc 时)。
尽管再次发出请求时 sessionid (可能)没有发生变化,但是你会发现 global.asax session_start 事件被触发。你还可以使用 this.session.isnewsession 属性来判断当前 session 是否重新创建的。
由于某些组件和控件可能要使用 session 信息(如使用 this.session.syncroot 进行同步),因此不要轻易使用该方法清理 session。
3. 用户身份验证
不要使用 this.session["username"] = "zhangsan" 、if (this.session["username"] != null) 这样的方式进行用户身份验证,这种方式既不安全也不合理。有关身份验证请参考 msdn 文档或雨痕写的相关文章。