使用者未登入或Session逾時時重新導向到登入頁,不那麼簡單!

來源:互聯網
上載者:User
   在網站開發中,我們經常有這樣的情境出現:
   情景1:對未登入的使用者或沒有許可權的使用者,當其想訪問某個受限網頁時,系統要能夠自動轉到登入頁面.
   情景2:對於用Session儲存使用者狀態的情況還有這樣一種需求,當使用者的Session已逾時時,使用者再想執行操作時,也要將其轉到登入頁面.
   在asp.net中,要實現上述的功能容易嗎?有人會說:"這太容易了,可以通過下面兩種方式實現".
   方法一:直接調用asp.net中的Response.Redirect方法實現  

Response.Redirect("login.aspx");

   方法二:通過asp.net調用js指令碼來實現Response.Write("<script>window.location='login.aspx';</script>");

   然而,真的這麼簡單嗎?對於情景1,兩種方法的確都可以實現.在網站的後台管理中,我們經常把管理功能放在一個框架組(或者用iframe來實現),左邊是操作功能,右邊是具體的操作頁面.這時候,對於兩種方法,都會出現是在左邊或右邊架構中開啟login.aspx頁,而不是我們想要的那種在頂層視窗中開啟login.aspx頁的情況.出現這種情況,第一種方法已經無能為力了,因為其只能在當前操作視窗中進行轉向.對於第二種方法,有人說我可以修改一下就可以了嘛:  

Response.Write("<script>window.parent.location='login.aspx';</script>");

這樣,就可以保證在父視窗中開啟登入頁了.不過,我們的代碼要同時考慮到情景1和情景2的情況,在情景1中,上邊那段代碼會報錯,因為其沒有父視窗嘛.可能有人已經急不可待地說,這有什麼難的,我再修改成下面這樣不就可以了嗎?

Response.Write("<script>window.top.location='login.aspx';</script>");

   看起來,對於情景1和情景2兩種情況來說,這種寫法已經可以解決這個問題了。但真的是這樣嗎?我們一般把判斷使用者是否登入放在Page_Load事件中,當使用者未登入,沒有許可權或session逾時時,就執行上面的代碼,讓其轉到登入頁.而在Page_Load事件中,我們還要經常做一些跟使用者Session相關的操作.舉一個最簡單的例子,當使用者未登入或session逾時時,我們將其轉向登入頁,當使用者已經登入時,我們將使用者的資訊顯示在頁面中.這時如果我們偵錯工具,呈現session逾時的情景(可以通過命令列下iisreset命令重啟iis來類比),就會發現出現異常.出現異常的原因是當執行Response.Write時程式會再次向伺服器回傳,觸發Page_Load事件,這時Session已丟失,所以寫在Page_Load中的取Session的代碼會產生異常.
   經過研究,我想出瞭解決辦法:
   那就是先使用Response.Redirect轉向一個中間頁,比如Nologin.htm,再在這個中間頁的onLoad事件中執行轉向到登入頁的javascript代碼:  

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title></title>
</head>
<script type="text/javascript">
function Redirect()
{        
    window.top.location = "login.aspx";
}
</script>
<body onload="Redirect();">
</body>
</html>

  這樣就能適應前面所說的所有情境了.
  大家可能注意到了我這個html頁面的<title></title>標記之間沒有內容.為什麼呢?如果有標題的話,你執行完轉向之後,會在瀏覽器的"後退"按鈕的下拉式清單中看到對應的標題,也就是說使用者會知道我們通過中間頁進行了中轉.如果沒有標題的話,就看不我們中轉的那個頁,就和直接轉到登入頁一樣.
  通過這個問題的解決可以發現,多想一些,想全面一些對做程式有多麼重要!

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.