ASP.NET 管理員登入

來源:互聯網
上載者:User

本節我們將完成管理員的登入和登出,這裡要學習一個重要的知識點“會話(Session)”。因為HTTP協議是無狀態非持續串連的協議,它沒有辦法識別用戶端,也無法記住用戶端的狀態,所以需要使用額外的手段——會話Session,來記錄用戶端的狀態。用戶端每次訪問伺服器,伺服器都會給它分配一個唯一的Session ID,來標示這個串連。如果用戶端沒有關閉串連,繼續訪問伺服器的話,那它的的ID就沒有變,伺服器就知道,上一次串連和這一次串連時來自同一個用戶端。如果用戶端關閉串連,它的Session
ID就清空,這時新開一個串連來訪問伺服器,伺服器就會又分配一個新的Session ID來標示這個用戶端。這就像我們訪問QQ空間一樣,需要先登入,登入後只要不關閉IE瀏覽器,Session ID沒有變化,我們就可以任意的訪問日誌、相簿等功能。如果我們關閉IE或者選擇退出後,就會清空Session ID,這時我們再訪問QQ空間,因為Session ID已經被清空,所以伺服器不能識別我們剛才已經登入過了,所以分配給給我們一個新的Session ID,並要求我們重新登入。
Session 允許通過將Object Storage Service在 Web 服務器的記憶體中,這樣在整個使用者會話過程中就可以通過儲存的用戶端資訊來識別用戶端,也可以暫存一些小的資料。在Session儲存資料是用“索引值對(Key-Value)”來實現的,鍵相當於ID,是一個唯一的標識符,值是我們需要儲存的資料。ASP.NET中Session操作的文法如下:
Session.Add ( "AdminName", "張三" ); // 把 張三 這個字串暫存在Session中,並給它一個標識符 AdminName
Session.Add ( "AdminID", "12" ); // 把 12 這個字串暫存在Session中,並給它一個標識符 AdminID
string s1 = Session["AdminName"].ToString(); /* 從Session把標識符為AdminName的值取出來,轉換成字串,賦值給s1,s1 = "張三"  */
string s2 = Session["AdminID"].ToString(); // s2 = "12"
 
在具備Session的知識之後,我們就可以開始完成使用者登入和登出功能。
1、在網站根目錄下(注意:管理員登入屬於前台頁面),建立一個頁面Admin_Login.aspx,選擇主版頁面MasterPage.Master 。開啟設計檢視,設計一個如下頁面。其中,在使用者名稱的上方,從工具箱中拖入1個Label控制項,用來顯示登入失敗後的資訊,使用者名稱和密碼後面拖入2個文本輸入框TextBox控制項,MaxLength=“20”
屬性限定輸入不超過20個字元,TextMode=“Password" 屬性標示這是一個密碼輸入框。在使用者名稱和密碼輸入框的後面,從【工具箱】-【驗證】欄目中拖入2個“RequiredFieldValidator 必填選項驗證控制項 ”,然後選中第一個RequiredFieldValidator控制項,開啟屬性面板,設定 ControlToValidate屬性為TextBox1,表示這個驗證控是驗證TextBox1有沒有輸入內容;設定 ErrorMessage屬性為“必填選項”,表示當TextBox1沒有輸入內容就提交時,提示“必填選項”這四個字。同理,選中第二個RequiredFieldValidator控制項,設定
ControlToValidate屬性為TextBox2,表示這個驗證控是驗證TextBox2有沒有輸入內容;設定 ErrorMessage屬性為“必填選項”。最後再拖入一個Button按鈕,Text屬性為“登入”。
 

選擇源視圖,查看我們用到了哪些控制項,以及每個控制項設定了哪些屬性:

     <h3>使用者登入:</h3><br />
    <p>
        <asp:Label ID="Label1" runat="server" Text=""  ForeColor="Red" Font-Size="Larger"></asp:Label>
    </p>
        <p>
        使用者名稱:<asp:TextBox ID="TextBox1" runat="server" MaxLength="20"></asp:TextBox>&nbsp;
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
            ControlToValidate="TextBox1" ErrorMessage="必填選項"></asp:RequiredFieldValidator>
    </p>
    <p>
        密&nbsp; 碼:<asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox>&nbsp;
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" 
            ControlToValidate="TextBox2" ErrorMessage="必填選項"></asp:RequiredFieldValidator>

    </p>
     <p>
        <asp:Button ID="Button1" runat="server" Text=" 登  錄 " Height="24px" 
            onclick="Button1_Click" />
    </p>


 2、選擇Admin_Login.aspx的設計檢視,在登入按鈕上雙擊,開啟Admin_Login.aspx.cs頁面,完成Button1_Click()方法: 

         protected void Button1_Click(object sender, EventArgs e)
    {
        // 先讓Label1的文本為空白字串,隱藏錯誤資訊
        Label1.Text = "";
        string s = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + Server.MapPath("~/App_Data/MyDataBase.mdb");
        using (OleDbConnection conn = new OleDbConnection(s))
        {
            // 定義SQL語句,@Admin 表示這是一個預留位置,@Password表示這是另外一個預留位置
            string sql = "select * from Admin where AdminName = @AdminName and [password] = @Password";
            OleDbCommand cmd = new OleDbCommand(sql, conn);
            // 把TextBox1的輸入框的內容賦值給@Admin預留位置
            cmd.Parameters.AddWithValue("@AdminName", TextBox1.Text);
            // 把TextBox2的輸入框的內容賦值給@Password預留位置
            cmd.Parameters.AddWithValue("@Password", TextBox2.Text);
            conn.Open();
            // 賦值完成之後,sql就是一條完整的查詢語句
            OleDbDataReader rd = cmd.ExecuteReader();
            if (rd.Read())
            {
                // 如果有記錄,說明使用者名稱和密碼正確
                // 把使用者名稱放入Session中暫存起來,同時給它一個標識符 AdminName
                Session.Add("AdminName", TextBox1.Text);
                // 把使用者ID放入Session中暫存起來,同時給它一個標識符 AdminID
                Session.Add("AdminID", rd["ID"].ToString());
                // 把使用者權限放入Session中暫存起來,同時給它一個標識符 Purview
                Session.Add("Purview", rd["Purview"].ToString());
                // 登入成功,跳轉到背景管理員管理頁面
                Response.Redirect("admin/Admin_Man.aspx");                
            }
            else
            {
                // 使用者名稱和密碼不匹配,提示出錯資訊
                Label1.Text = "使用者名稱或密碼錯誤,請重新輸入!";
            }
        }
    }

 
3、繼續Admin_Login.aspx.cs頁面,在Page_Load()方法中,添加以下代碼,清空Session中的資料:

     protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // 清空Session中暫存的資料
            Session.Clear();
        }
    }

 
4、選擇全部儲存。然後開啟後台主版頁面(admin檔案夾裡的MasterPage2.master),在設計檢視下,輸入“目前使用者:”和“許可權”,然後選擇源視圖,在目前使用者和許可權後,輸入如下代碼:

 <h2>目前使用者:<%= Session["AdminName"] %>;許可權:<%= Session["Purview"] %>
&nbsp;<a href="../Admin_Login.aspx">登入</a> | <a href="Admin_Add.aspx">新增管理員</a> | <a href="Admin_Man.aspx">管理員管理</a> | <a href="Class_Man.aspx">欄目管理</a> </h2>

注意粗體標示的部分:Session["AdminName"] 表示從Session取出Key為AdminName的資料,Session["Purview"] 表示從Session取出Key為Purview的資料,<%= Session["AdminName"] %>表示把從Session取出來的資料在頁面上顯示,例如<%= "張三" %>就會在頁面上顯示 張三 這個字串。此外,還加多一個到登入頁面的超級連結,注意路徑的寫法
../Admin_Login.aspx ,../表示上一級目錄,../Admin_Login.aspx 表示上一級目錄中的Admin_Login.aspx頁面。
把Admin_Login.aspx設為起始頁,我們就可以看到實際效果了:只有使用者名稱和密碼正確才能登入成功,試試不同使用者,登入成功後會顯示目前使用者的使用者名稱和許可權。
這裡需要重點提示,在新增管理員頁面Admin_Add.aspx中,SQL語句的寫法,"'" + TextBox1.Text + "','" +TextBox2.Text + "' "  ...  這裡TextBox1.Text前後的雙引號中,是1個單引號,而不是空格單引號,像"' " + TextBox1.Text + " ',' "  
錯了。就像 "張三"  和 "  張三 " 是兩個不同的字串,第二個張三前後各有1個空格,第一個沒有。所以,使用者名稱密碼正確,但登入不成功,檢查一下Access資料庫中Admin表中的AdminName和Password欄位的值,前後是不是有多餘的空格?
但這裡還有一個小小的問題,就是如果我們運行Admin_Login.aspx頁面後,並不登入,而是在地址欄中直接輸入管理員管理頁面的URL,也就是在地址欄中,把Admin_Login.aspx用admin/Admin_Man.aspx替換掉,然後斷行符號,就可以避開登入,直接存取後台頁面了。這是一個很危險的事情,我們需要完成使用者登入的最後一個步驟。
 
5、開啟後台主版頁面的cs檔案,也就是MasterPage2.master.cs,在Page_Load()方法中,添加以下代碼:

     protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["AdminID"] == null)
            {
                // Session["AdminID"]為空白,則說明沒有登入;因為登入成功後,我們會把管理員的ID暫存在Session中
                // 彈出一個警告框 
                Response.Write("<script>alert('請登入後訪問本頁面!');</script>");
                // 跳轉到登入頁面
                Response.Write("<script>location.href='../Admin_Login.aspx';</script>");
            }
        }
    }

 
6、選擇全部儲存,就可以看到完整的登入效果,在地址欄中試圖輸入URL來訪問後台頁面,好像不大可能了。哇,太酷了!在下一節課中,我們將完善使用者登入程式,為它加上驗證碼,這離網站的成功又近了一步,同學們,好好加油!
此文重點突出,淺顯易懂,幫轉載,原文地址:
http://justinsoho.blog.163.com/blog/static/14078207220103881651169/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.