关于session的判断

上传人:第*** 文档编号:32821527 上传时间:2018-02-12 格式:DOCX 页数:5 大小:23.26KB
返回 下载 相关 举报
关于session的判断_第1页
第1页 / 共5页
关于session的判断_第2页
第2页 / 共5页
关于session的判断_第3页
第3页 / 共5页
关于session的判断_第4页
第4页 / 共5页
关于session的判断_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《关于session的判断》由会员分享,可在线阅读,更多相关《关于session的判断(5页珍藏版)》请在金锄头文库上搜索。

1、从判断 SessionUserName.ToString()为 null 和所想到的(2010-11-24 13:38:21)转 载 标签: 杂谈A 安全验证模式提供了验证用户访问的很好模式,但是还有很多情况下需要我们采用传统的 Session 方式来解决用户登录验证问题,比如一些简单的验证。今天打开 CSDN 就发现了一个帖子,该帖子的楼主正在利用这种方式验证用户是否登陆,但是在这个过程中出现了错误,具体是怎么回事呢?原来搂主想写个方法,该方法功能是判断用户是否登陆,如果没登陆,则自动跳转到登陆页面。楼主的具体判断条件是 Session“username”是否为空,如果Session“use

2、rname”.ToString()为 null 或者为则表示未登陆,跳转到一个提示页面。具体代码示例如下:public int IsUser()if (SessionUserName.ToString() = null | SessionUserName.ToString() != null & SessionUserName.ToString() = )/可能非有意的引用比较;若要获取值比较,请将左边转为类型 string/Response.Redirect (./index.aspx);/Response.Write( alert(你不是管理员!);location.href=Defaul

3、t.aspx; );return 1;elsereturn 0;楼主在运行这段代码的时候,vs2005 始终出现提示当前上下文中不存在 session,这个是因为相应的代码环境和 cs 文件的位置所决定的,利用System.Web.HttpContext.Current.Session 来调用 Session 即可。如果了解 底层机制,我们就会发现,SessionUserName,其实是 HttpConText 的属性,在 aspx 文件关联代码中,其提升为 Page 的属性,所以我们可以如此方便调用,而在非关联代码文件中,则必须通过 System.Web.HttpContext.Curre

4、nt.Session 方式调用。此时改正后的代码示例如下(不考虑逻辑问题):public int IsUser() if (System.Web.HttpContext.Current.SessionUserName.ToString() = null | System.Web.HttpContext.Current.Session UserName.ToString() != null & System.Web.HttpContext.Current.Session UserName.ToString() = )/可能非有意的引用比较;若要获取值比较,请将左边转为类型 string/Resp

5、onse.Redirect (./index.aspx);/Response.Write( alert(你不是管理员!);location.href=Default.aspx; );return 1;elsereturn 0;其实,这里还有问题,我们抛开如上问题和其中的逻辑错误问题不谈,有经验的程序员,一下子就会看出问题所在。让我们仔细分析一下,经过如上所说的修正,我们运行程序就会看到异常显示“ 未将对象引用设置到对象的实例 ”的错误 , 然后调试,发现了没有这个Session,因为还没有创建,所以更无法使用 ToString()。这样我们明白了,在没登陆时,Session“username”

6、 =null,此时条件: Session“username”.ToString()过程中,会出现异常。我们可以想到,如果把先判断 Session“username” 是否为 null,再判断楼主的条件,即可。这里有两种方法,一种是在外层或前面再加一个 if 语句;另一种是采用& 和|运算符(详见逻辑运算符用法),把 Session“username” =null 放到楼主所写条件的前面,这是因为采用& |运算符并且 Session“username” =null 在判断最前,因而程序先判断 Session“username” =null,如果不满足条件,则不会继续判断后面的条件,如果满足条件,

7、则继续判断后面的条件,而此时不具备出现异常的情况。采用如上所述方法程序程序会运行通过,无错误,符合功能需要(抛弃楼主条件中的逻辑错误)。此时修改后的代码示例(不考虑逻辑问题)如下:public int IsUser()if (System.Web.HttpContext.Current.SessionUserName=null)|System.Web.HttpContext.Current.SessionUserName.ToString() = null | System.Web.HttpContext.Current.Session UserName.ToString() != null

8、& System.Web.HttpContext.Current.Session UserName.ToString() = )/可能非有意的引用比较;若要获取值比较,请将左边转为类型 string/Response.Redirect (./index.aspx); /Response.Write( alert(你不是管理员!);location.href=Default.aspx; );return 1;elsereturn 0;如上只是解决了运行问题,从好的程序方面考虑,还有两个问题:首先,楼主在处理 Session 转换为 string 类型时也可以采用(string)Session“u

9、sername”的方式,此时 Session“username”为 null 时,不会出现错误,就可不先判断 Session“username”是否为 null。其次,楼主采用的验证字符串为 null 或的方法很不好,应该采用如下方法:string.IsNullOrEmpty(string)SessionUserName),这个方法如果字符串为 null 或者,则返回 True,否则返回 False。此时,很简洁,而且省去很多判断。综合以上,这时,可以不判断 Session UserName值为 null 的情况(如考虑则有助于减少实际运行时类型转换的次数),修改后的代码示例(修正了逻辑问题)

10、如下:public int IsUser()if (string.IsNullOrEmpty(string) System.Web.HttpContext.Current.Session UserName)/可能非有意的引用比较;若要获取值比较,请将左边转为类型 string/Response.Redirect (./index.aspx);/Response.Write( alert(你不是管理员!);location.href=Default.aspx; );return 1;elsereturn 0;深究一下,从好的设计方面来讲,这里还有问题,就是楼主的登录验证思路设计,楼主验证是否登陆

11、,还要判断 SessionUserName.ToString()为 null 或,为什么呢?因为很可能楼主在退出登陆的时候,将退出代码写为:SessionUserName=。此时就必须判断:SessionUserName.ToString()为的情况。其实,大可不必如此,退出登录代码写为:SessionUserName=null;这样,就决不会出现用户没有登陆,并且 SessionUserName.ToString() 为的情况。即 SessionUserName为 null 时,表示没有登陆,而 SessionUserName不为 null 时,表示已经登陆,只有这两种情况。所以只要判断 S

12、essionUserName是否为 null 即可断定是否登陆。修改后的代码示例如下:public int IsUser()if (System.Web.HttpContext.Current.Session UserName=null)/可能非有意的引用比较;若要获取值比较,请将左边转为类型 string/Response.Redirect (./index.aspx);/Response.Write( alert(你不是管理员!);location.href=Default.aspx; );return 1;elsereturn 0;总结一下,这里有几个知识点:1、Session 对象的引

13、用问题。这个如果学习过 HttpContext 对象,对 内部原理有了解,那很容易理解这个问题。2、字符串为 null 和的判断问题明确(等于 string.Empty)和 null 的区别。表示内存中实际存在,表示 0 长度的空子符串;null 表示并不存在这个量。3、Null表示不存在,未定义。适用引用类型,值类型不可以(值类型可以利用可空类型来实现)。4、对象名.ToString()和(string)对象名的区别本质上是面向对象编程的一个问题。对象名.ToString() ,这个语法告诉我们 ToString()是这个对象的方法,如对象不存在为 null,那么会出现错误,必须在这之前判断该对象是否存在。而(string)对象名,是将指定对象转换为 string 类型,如果对象为 null,因为字符串也可以为 null,所以不会出现错误。综上所述,本质上这是个空值判断问题。C#2.0 引入了可空类型,加上 null 关键字,就可以很好解决这类问题了。类似的,从数据库中读取字段的判断也属于这个问题,可能会出现 null 的情况,但有可能是值类型,这时候可空类型就有用了。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号