Web应用的状态管理——客户端状态管理
大家好,我是小雨,QQ:798033502 今天给大家代理的是web应用的状态管理第二讲,客户端状态管理。
客户端状态管理
不如服务器端状态管理选项安全(恶意的用户可通过某些方法来篡改 或读取其中的内容)
不如服务器端管理选项可靠(用户可以删除 Cookie)
可存储的信息量可能受到限制
客户端状态维护技术主要有下面几个:
视图状态
隐藏域
查询字符串
Cookie
设置@Page指令或Page的EnableViewState属性指示当前页请求结束时,该页是否保持其视图状态以及它包含的任何服务器控件的视图状态
关闭页面的视图状态
1,<%@ Page EnableViewState="false" %>
2,protected void Page_Load(object sender, EventArgs e)
{
Page.EnableViewState = false;
}
3,<asp:GridView ID="GridView1" runat="server" EnableViewState="false">
</asp:GridView>
在配置文件中设置是否保留视图状态
在配置文件Web.config的system.web节点下,修改Pages元素的EnableViewState属性,来控制所有页面是否启用视图状态信息
<system.web>
<!---->
<pages enableViewState="false"></pages>
</system.web>
对视图状态进行分块
设置页的 MaxPageStateFieldLength 属性,对ViewState 属性中存储的数据进行分块,可以在Web.config文件中设置分块大小
<pages enableViewState="true" maxPageStateFieldLength="100"></pages>
使用视图状态存取数据
视图状态(ViewState)是一个字典对象,通过Page类的ViewState属性公开,是页用来在往返行程之间保留页和控件属性值的默认方法(只在本页有效)
ViewState["view1"] = "Hello World";
视图状态可存储的数据类型:字符串;整数;布尔值;Array 和ArrayList 对象;哈希表;自定义类型转换器
使用视图状态具有以下3个优点:
耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。
易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。
增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。
使用视图状态具有以下3个缺点:
性能问题。由于视图状态存储在页本身,因此如果存储较大的值,用户显示页和发送页时的速度可能减慢。
设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,对于移动设备上的服务器控件,将使用其它的实现方法。
潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果在客户端直接查看页源文件,可以看到隐藏域中的信息,这导致潜在的安全性问题。
隐藏域
隐藏域是一个存储库,直接存储在页中的任何特定于页的信息,在视图状态、会话状态和 Cookie 等方法被禁用或不可用,则可以使用 HiddenField 控件来存储状态值
隐藏域的设置和读取
<asp:HiddenField ID="h1" runat="server" />
protected void Page_Load(object sender, EventArgs e)
{
string strUserName = "Jakey";
h1.Value = strUserName;
}
查询字符串
查询字符串提供了一种维护状态信息的方法 ,输入查询字符串以问号 (?) 开始的属性/值对,且可以有多个查询字符串,它们之间以“&”分隔
http://itbook.taobao.com/listwidgets.aspx?category=basic&price=100
使用查询字符串的优点:
不需要任何服务器资源。查询字符串包含在对特定URL的HTTP请求中。
广泛的支持。几乎所有的浏览器和客户端设备均支持使用查询字符串传递值。
实现简单。ASP.NET完全支持查询字符串方法,其中包含了使用HttpRequest对象的Params属性读取查询字符串的方法。
使用查询字符串的缺点:
潜在的安全性风险。用户可以通过浏览器直接看到查询字符串中的信息。用户可将此URL设置为书签或发送给别的用户,从而通过此URL传递查询字符串中的信息。
有限的容量。有些浏览器和客户端设备对URL的长度有2083个字符的限制。
Cookie概述
Cookie 是存储在客户端文件系统的文本文件中,或者存储在客户端浏览器会话的内存中的少量的数据
Cookie 是随页输出并由服务器发送到客户端的特定于站点的信息
Cookie 可以是临时的(随着浏览器关闭而自动消失),也可以是永久性的
Cookie 保存在客户端设备上,当浏览器请求某页时,客户端会将 Cookie 中的信息连同请求信息一起发送。服务器可以读取 Cookie 的值
Cookie的用途
用户的个人配置
登录和“remember me”
弹出窗口
编写Cookie
使用HttpResponse 对象 来设置Cookie,需要设置Cookie名称、值、过期时间等信息
//通过新建HttpCookie对象来添加Cookie
HttpCookie aCookie = new HttpCookie("lastVisit"); //新建HttpCookie对象
aCookie.Value = DateTime.Now.ToString();
aCookie.Expires = DateTime.Now.AddDays(1); //设置Cookie的过期
Response.Cookies.Add(aCookie); //将Cookie添加到Cookies集合
//读取Cookie值
string userName;
if (Request.Cookies["userName"] != null){
userName = Request.Cookies["userName "].Value;
}
编写多值Cookie
在一个 Cookie 中存储多个名称/值对,名称/值对称为子键
//直接添加Cookie
Response.Cookies["userInfo"]["userName"] = "patrick";
Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString();
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1);
//读取Cookie值
string userName;
if (Request.Cookies["userName"] != null){
if (Request.Cookies["userInfo"] ["userName"] != null){
userName = Request.Cookies["userInfo"]["userName "]; }
}
控制Cookie的范围
限制 Cookie 的域范围
Response.Cookies["domain"].Value = DateTime.Now.ToString();
Response.Cookies["domain"].Expires = DateTime.Now.AddDays(1);
Response.Cookies["domain"].Domain = "support. microsoft.com";
将 Cookie 限制到某个文件夹或应用程序
HttpCookie appCookie = new HttpCookie("AppCookie");
appCookie.Value = "written " + DateTime.Now.ToString();
appCookie.Expires = DateTime.Now.AddDays(1);
appCookie.Path = "/App1";
Response.Cookies.Add(appCookie);
修改和删除Cookie
由于Cookie存储在客户端,不能直接修改和删除 Cookie
通过给Cookie赋新值替换旧版本Cookie的办法来修改
可以通过设置Cookie立即过期的办法来删除Cookie
Cookie的应用
一般只要有会员、用户机制的网站或论坛在登录的时候都会有这么一个复选框——[记住我的名字|两周内不再登录|在此计算机上保存我的信息],说法较多,实现起来差不多,下面就来实现这样一个简单的例子。