asp.net 常用传值方式及其优缺点分析

来源:互联网 发布:免费下载淘宝网到桌面 编辑:程序博客网 时间:2024/06/07 01:44
     这一段时间页面传值使用多的是重定向方法,但是传送的值会显示在浏览器中,看着十分不安全,所以就总结了一下其他的方法,以后尽量使用别的方法。

一、使用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报错,应该是少了什么引用,没有成功的运行出来,我还需要再查询一下。


六、站在巨人们的肩膀上

感谢 伟旗的专栏   Asp.net页面传值的优缺点  页面传值适用范围 优秀文章的分享。


小结:

故事还没有完结,回想一下get/post/MVC中如何使用,还需要再复习一下。



0 0
原创粉丝点击