<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    【轉(zhuǎn)】從判斷Session["UserName"].ToString()為null和""所想到的



    Asp.net安全驗(yàn)證模式提供了驗(yàn)證用戶訪問(wèn)的很好模式,但是還有很多情況下需要我們采用傳統(tǒng)的Session方式來(lái)解決用戶登錄驗(yàn)證問(wèn)題,比如一些簡(jiǎn)單的驗(yàn)證。今天打開(kāi)CSDN就發(fā)現(xiàn)了一個(gè)帖子,該帖子的樓主正在利用這種方式驗(yàn)證用戶是否登陸,但是在這個(gè)過(guò)程中出現(xiàn)了錯(cuò)誤,具體是怎么回事呢?

    原來(lái)?yè)е飨雽?xiě)個(gè)方法,該方法功能是判斷用戶是否登陸,如果沒(méi)登陸,則自動(dòng)跳轉(zhuǎn)到登陸頁(yè)面。樓主的具體判斷條件是Session[“username”]是否為空,如果Session[“username”].ToString()為null或者為""則表示未登陸,跳轉(zhuǎn)到一個(gè)提示頁(yè)面。具體代碼示例如下:

    public int IsUser()

    {

    if (Session["UserName"].ToString() == null || Session["UserName"].ToString() != null && Session["UserName"].ToString() == "")

    {

    //可能非有意的引用比較;若要獲取值比較,請(qǐng)將左邊轉(zhuǎn)為類型string

    //Response.Redirect ("../index.aspx");

    //Response.Write(" <script language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

    return 1;

    }

    else

    {

    return 0;

    }

    }
    樓主在運(yùn)行這段代碼的時(shí)候,vs2005始終出現(xiàn)提示"當(dāng)前上下文中不存在session",這個(gè)是因?yàn)橄鄳?yīng)的代碼環(huán)境和cs文件的位置所決定的,利用System.Web.HttpContext.Current.Session來(lái)調(diào)用Session即可。如果了解asp.net底層機(jī)制,我們就會(huì)發(fā)現(xiàn),Session["UserName"],其實(shí)是HttpConText的屬性,在aspx文件關(guān)聯(lián)代碼中,其提升為Page的屬性,所以我們可以如此方便調(diào)用,而在非關(guān)聯(lián)代碼文件中,則必須通過(guò)System.Web.HttpContext.Current.Session方式調(diào)用。此時(shí)改正后的代碼示例如下(不考慮邏輯問(wèn)題):

    public int IsUser()

    {

    if (System.Web.HttpContext.Current.Session["UserName"].ToString() == null || System.Web.HttpContext.Current.Session ["UserName"].ToString() != null && System.Web.HttpContext.Current.Session ["UserName"].ToString() == "")

    {

    //可能非有意的引用比較;若要獲取值比較,請(qǐng)將左邊轉(zhuǎn)為類型string

    //Response.Redirect ("../index.aspx");

    //Response.Write(" <script language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

    return 1;

    }

    else

    {

    return 0;

    }

    }

    其實(shí),這里還有問(wèn)題,我們拋開(kāi)如上問(wèn)題和其中的邏輯錯(cuò)誤問(wèn)題不談,有經(jīng)驗(yàn)的程序員,一下子就會(huì)看出問(wèn)題所在。讓我們仔細(xì)分析一下,經(jīng)過(guò)如上所說(shuō)的修正,我們運(yùn)行程序就會(huì)看到異常顯示“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例”的錯(cuò)誤,然后調(diào)試,發(fā)現(xiàn)了沒(méi)有這個(gè)Session,因?yàn)檫€沒(méi)有創(chuàng)建,所以更無(wú)法使用ToString()。這樣我們明白了,在沒(méi)登陸時(shí),Session[“username”] =null,此時(shí)條件: Session[“username”].ToString()過(guò)程中,會(huì)出現(xiàn)異常。我們可以想到,如果把先判斷Session[“username”] 是否為null,再判斷樓主的條件,即可。

    這里有兩種方法,一種是在外層或前面再加一個(gè)if語(yǔ)句;另一種是采用&& 和||運(yùn)算符(詳見(jiàn)邏輯運(yùn)算符用法),把Session[“username”] ==null放到樓主所寫(xiě)條件的前面,這是因?yàn)椴捎?amp;& ||運(yùn)算符并且Session[“username”] ==null在判斷最前,因而程序先判斷Session[“username”] =null,如果不滿足條件,則不會(huì)繼續(xù)判斷后面的條件,如果滿足條件,則繼續(xù)判斷后面的條件,而此時(shí)不具備出現(xiàn)異常的情況。采用如上所述方法程序程序會(huì)運(yùn)行通過(guò),無(wú)錯(cuò)誤,符合功能需要(拋棄樓主條件中的邏輯錯(cuò)誤)。此時(shí)修改后的代碼示例(不考慮邏輯問(wèn)題)如下:

    public int IsUser()

    {

    if ((System.Web.HttpContext.Current.Session["UserName"]==null)||System.Web.HttpContext.Current.Session["UserName"].ToString() == null || System.Web.HttpContext.Current.Session ["UserName"].ToString() != null && System.Web.HttpContext.Current.Session ["UserName"].ToString() == "")

    {

    //可能非有意的引用比較;若要獲取值比較,請(qǐng)將左邊轉(zhuǎn)為類型string

    //Response.Redirect ("../index.aspx");

    //Response.Write(" <script language=javascript> alert('你不是管理員!');location.href='Default.aspx'; </script> ");

    return 1;

    }

    else

    {

    return 0;

    }

    }

    如上只是解決了運(yùn)行問(wèn)題,從好的程序方面考慮,還有兩個(gè)問(wèn)題:

    首先,樓主在處理Session轉(zhuǎn)換為string類型時(shí)也可以采用(string)Session[“username”]的方式,此時(shí)Session[“username”]為null時(shí),不會(huì)出現(xiàn)錯(cuò)誤,就可不先判斷Session[“username”]是否為null。

    其次,樓主采用的驗(yàn)證字符串為null或""的方法很不好,應(yīng)該采用如下方法:string.IsNullOrEmpty((string)Session["UserName"]),這個(gè)方法如果字符串為null或者"",則返回True,否則返回False。此時(shí),很簡(jiǎn)潔,而且省去很多判斷。

    綜合以上,這時(shí),可以不判斷Session ["UserName"]值為null的情況(如考慮則有助于減少實(shí)際運(yùn)行時(shí)類型轉(zhuǎn)換的次數(shù)),修改后的代碼示例(修正了邏輯問(wèn)題)如下:

    public int IsUser()

    {

    if (string.IsNullOrEmpty((string) System.Web.HttpContext.Current.Session ["UserName"]))

    {

    //可能非有意的引用比較;若要獲取值比較,請(qǐng)將左邊轉(zhuǎn)為類型string

    //Response.Redirect ("../index.aspx");

    //Response.Write(" <script language=javascript> alert('你不是管理員!

    posted on 2012-11-06 17:59 ** 閱讀(179) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊(cè)

    收藏夾

    C#學(xué)習(xí)

    友情鏈接

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 成人A片产无码免费视频在线观看| 亚洲av永久无码精品三区在线4 | 亚洲国产精品13p| 亚洲精品456人成在线| 16女性下面扒开无遮挡免费| 久久精品国产亚洲77777| 国产精品偷伦视频免费观看了| 亚洲第一区在线观看| 色妞www精品视频免费看| 免费大学生国产在线观看p| 污网站免费在线观看| 久久亚洲AV永久无码精品| 在线观看免费黄色网址| 亚洲最大成人网色| 国产精品永久免费10000| 亚洲av无码专区在线观看亚| 大胆亚洲人体视频| 你是我的城池营垒免费看 | 亚洲最大激情中文字幕| 久久免费高清视频| 亚洲精品资源在线| 免费黄色小视频网站| eeuss影院免费直达入口| 亚洲AV成人精品网站在线播放| 99热在线观看免费| 亚洲国产AV一区二区三区四区| 亚洲国产午夜中文字幕精品黄网站| 岛国精品一区免费视频在线观看| 亚洲高清在线观看| 男人的好免费观看在线视频| 免费人成动漫在线播放r18 | 亚洲白色白色永久观看| 免费无码看av的网站| 在线观看免费视频一区| 亚洲人成图片网站| 国产gv天堂亚洲国产gv刚刚碰| 欧洲一级毛片免费| 一级毛片免费视频网站| 亚洲天堂一区二区三区四区| 亚洲乱码国产一区网址| 18禁网站免费无遮挡无码中文|