1. 程式人生 > >asp.net 常用傳值方式及其優缺點分析

asp.net 常用傳值方式及其優缺點分析

     這一段時間頁面傳值使用多的是重定向方法,但是傳送的值會顯示在瀏覽器中,看著十分不安全,所以就總結了一下其他的方法,以後儘量使用別的方法。

一、使用response.Redirect

這種方式是一種最簡單的傳值方式,使用簡單方便。但是有一個缺點,它傳送的值顯示在瀏覽器的位址列中,如果不是傳遞的資料安全性不是很高,可以使用這個方法。但是對於傳送陣列和物件的時候,用這個方法就不可以了。

傳值頁面:

 protected void BtSearchHistory_Click(object sender, EventArgs e)
   {
    Response.Redirect("attdendanceHistory.aspx?groupno="+lblgroupno.Text.Trim()+"&"+"UserRoles="+ lblUserRoles.Text.Trim());
   }
接收頁面:
      {        // 獲取傳遞過來的groupno和UserRoles</span>
             if (Request.Params["groupno"] != null && Request.Params["groupno"].Trim() != "")
                {
                    groupno = Request.Params["groupno"];
                }
                if(Request.QueryString["UserRoles"] !=null && Request.QueryString["UserRoles"].Trim() !="")
                {
                     userRoles = Request.QueryString["UserRoles"];
                }
         }

缺點:

如下圖,會在位址列中顯示傳遞值的資訊,不安全。不能夠傳遞物件


優點:

經典的傳值方式,使用非常簡單。

、使用application物件變數傳值

application物件的作用範圍是整個全域性,所以對所有的使用者都有效,和其配合在一起使用的方法是Lock和Unlock,用這兩個方法可以處理多個用於對儲存在Application物件的寫入問題。Lock方法鎖定全部的Application變數,從而阻止其他使用者修改Application物件的變數值。而UnLock是解除對Application物件的鎖定。

傳送頁:

protected void Page_Load(object sender, EventArgs e)
        {
            //Application傳值
            string name;
            application.lock();
            name = application["name"].tostring();
            label1.text = name;
            application.unlock();

        }
接收頁:
    protected void Button1_Click(object sender, EventArgs e)
        {
            //application傳值
            Application["name"] = "小娟娟";
            Server.Transfer("get.aspx");
        }

使用場景:這種方式是通過HttpApplication物件在伺服器生成一個狀態來儲存所需要的資訊,該Httpapplication物件變數可以作用於真個web應用程式,所以該物件一般儲存一些要公佈的資訊,而對於那些涉及到使用者個人的敏感資料,就不適合用這個方式來儲存。

對比Session:

Session是對於每個單獨的使用者,當用戶關閉當前瀏覽器,那麼Session會失效。Application 物件儲存的變數是針對於所有訪問程式的使用者,即使有使用者關閉了瀏覽器,變數的值也不會丟失。

三、cookie傳值

   cookie 是儲存區在使用者自己的電腦中,以文字的形式存在於磁碟中。這種方式很有意思,很多登入系統就是利用Cookie實現使用者身份自動登入。使用者登入一次的登入資訊將被寫入到使用者電腦的cookie檔案中,下次登入的時候,網站自動讀取cookie完成使用者身份驗證。和seesion使用的方法差不多,但是cookie是存放在客戶端的,session是存放在伺服器端的,cookie的使用要配合AsP.net內建物件request來使用。

需要注意的是:多數瀏覽器支援最多可以4096位元組的cookie,那麼要將為數不多的幾個值儲存在使用者計算機上,瀏覽器還限制了每個站點可以在使用者計算機上儲存的cookie資料。因為使用者還可以設定自己的瀏覽器,拒絕接受cookie,這種情況下,只能夠使用別的方式了。

傳送頁:

    protected void Button6_Click(object sender, EventArgs e)
        {
            HttpCookie cookie = new HttpCookie("UserName");
            cookie.Value = "小娟娟";
            Response.AppendCookie(cookie);
            Server.Transfer("get.aspx");

        }

接收頁:

    //cookie傳值
      Label1.Text = Request.Cookies["UserName"].Value.ToString();

優點:資料傳遞方式方便,儲存在客戶端,不佔用伺服器資源。

缺點:安全性不高,我們開發人員不應該過多的依賴於cookie,而應該用結合的方式完成對敏感資料的儲存。(2)多數瀏覽器對於cookie會有個數限制,而且並非所有瀏覽器都支援cookie,使用者可以禁止和刪除cookie,這種情況下使用就要十分小心了。

綜上所述:cookie還是少用吧。

四、session傳值和使用

   session作用於使用者個人,所有過多的儲存會導致伺服器的記憶體資源耗盡。這一段時間關於登陸和許可權判斷,用的最多的就是session,瞭解也比較多 ,除了傳值,也寫一下使用Session需要注意的東西。

建立Session:

     //建立Session
            HttpContext.Current.Session["teacherID"] = currentUser.UserID;
           HttpContext.Current.Session["operater"] = currentUser.UserName;</span>
接收session:
     #region 從登陸session 獲取使用者名稱和角色
                if (Session["userinfo"] == null || Session["userinfo"].ToString() == "")
                {
                    Maticsoft.Common.MessageBox.ShowAndRedirect(this, "請登入後檢視!", "/Mobile/Login.aspx");
                    return;

                }
             //獲取操作員和IP
                lblTeacherName.Text = Session["operater"].ToString();
                //獲取操作員和IP
                lblTeacherID.Text = Session["teacherID"].ToString();

          #endregion
Session 使用的時候,一定要判斷一下是否為空,增強程式碼的嚴謹性。這兩天進入測試階段,注意到以前很多沒有注意的問題,稍後會總結。

優點:

   這種方法將資料儲存在伺服器中,可以傳遞一個物件,傳遞資料比較多,安全性比較高。session 可以在應用程式的多個頁面中以名稱/值對的方式共享,直到瀏覽器使用者關閉自己的瀏覽器或者Session超時。(Session的時間可以自己設定,不設定,預設是20分鐘),所以常用於登入身份驗證中。例如:可以傳遞一個UserInfo,在別的頁面,可以任意取Use的各種屬性值。

缺點:

過多的Session會消耗伺服器的伺服器資源,所以使用要慎重。


五、使用Server.Transfer方法

   網上資料說這個才是面向物件所使用的方法,使用Server.Transfer方法把流程從當前一個頁面引導到另外一個頁面,新的頁面使用前一個頁面的應答劉,所以這個方法是完全面向物件的。

   使用這個方法我們可以在另一個頁面以公開物件屬性的方式來取值,首先定義一個public許可權的屬性,該屬性返回所需要傳遞的值。然後context..Handler屬性來獲得前一個頁面例項物件的引用,也就是可以通過訪問自定義的屬性來獲取需要的值。

傳送頁:

    protected void Button7_Click(object sender, EventArgs e)
        {
            Server.Transfer("get.aspx");
        }
        public string name
        {
            get { return "我是小娟娟"; }
        }
接收頁:
//server.Transer傳值
            a newweb;
            newweb = (source)Context.Handler;
            Label1.Text = newweb.name;
這裡面有一個問題,newweb=(source)Context.Handler中,這個source報錯,應該是少了什麼引用,沒有成功的執行出來,我還需要再查詢一下。

六、站在巨人們的肩膀上

小結:

故事還沒有完結,回想一下get/post/MVC中如何使用,還需要再複習一下。