日志文章

2007年08月11日 20:59:20

ASP.NET状态保存机制

客户端常见方式

1 视图状态ViewState

获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态。需要为将回发到自身的页存储少量信息。ViewState 属性的使用将提供具有基本安全性的功能。

Me.ViewState("page") = 1

Me.ViewState("page") = Convert.ToInt32(Me.ViewState("page")) – 1

Me.ViewState("strSql")=strQuerySQL ‘strQuerySQL为SQL文

  优点:不利用服务器端资源,实现简单,较高的安全性(经过哈希计算和压缩,并且针对 Unicode 实现进行编码)

  缺点:不宜存储较大的值。并且通过源文件可以看见其中的值,虽然经过哈希计算和压缩,但仍有被篡改的风险。 

2 隐藏控件HiddenField(HtmlàHidden):

此控件是2.0中新增的控件。通常情况下,Web 窗体页的状态由视图状态、会话状态和 cookie 来维持。但是,如果这些方法被禁用等,则可以使用 HiddenField 控件来存储状态值。适宜存储简单的对安全性毋要求的数据。

<asp:hiddenfield id="HdName" onvaluechanged="ValueHiddenField_ValueChanged" value="" runat="server"/>

Form1. HdName.value = “admin”;



  优点:不使用服务器资源 ,实现简单。

  缺点:安全性低。只支持简单的数据结构。



3: 利用Cookie:

Cookie Web 应用程序保存用户相关信息提供了一种有用的方法。需要在客户端存储少量信息并且不需要较高的安全性。(个性化)

[pre]Response.Cookies("userName").Value = "mike"
[/pre][pre]Response.Cookies("userName").Expires = DateTime.Now.AddDays(1)
[/pre][pre]
[/pre][pre]Dim aCookie As New HttpCookie("lastVisit")
[/pre][pre]aCookie.Value = DateTime.Now.ToString
[/pre][pre]aCookie.Expires = DateTime.Now.AddDays(1)
[/pre][pre]Response.Cookies.Add(aCookie)
[/pre]

Public Shared Sub Main(args() As String)

    If args Is Nothing OrElse args.Length <> 1 Then

        Console.WriteLine("Specify the URL to receive the request.")

        Environment.Exit(1)

    End If

    Dim request As HttpWebRequest = CType(WebRequest.Create(args(0)), HttpWebRequest)

    request.CookieContainer = New CookieContainer()

   

    Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)

    response.Cookies = request.CookieContainer.GetCookies(request.RequestUri)

    Dim cook As Cookie

    For Each cook In response.Cookies

        Console.WriteLine("Cookie:")

        Console.WriteLine("{0} = {1}", cook.Name, cook.Value)

        Console.WriteLine("Domain: {0}", cook.Domain)

        Console.WriteLine("Path: {0}", cook.Path)      

    Next cook

  End Sub

End Class 'CookieExample

  优点:不使用服务器资源,实现简单,可配置到期时间。

  缺点:大小受到限制,一般浏览器支持的最大的Cookie 容量为4096字节。客户端用户可能会配置为拒绝Cookie。安全性不高,适宜保存不敏感信息。保存期限受到客户端的配置影响。

4: QueryString

  将信息从一页传递给另一页的最简单的方法,不需要较高的安全性。

Send Page:
public int strID=0;
int intNUm =int.Parse (this.txtFromValue.Text)*1;          
Server.Transfer("WebRecieve.aspx?strID="+intNUm);
Receive   Page:
this.txtRecieve.Text=Request["strID"].ToString();
this.txtRecieve.Text=Request.Params["strID"].ToString();
this.txtRecieve.Text=Request.QueryString["strID"];


  优点:不使用服务器资源,支持广泛,实现简单

  缺点:安全性,因为直接在URL中暴露给用户 ,所以有被篡改的风险。长度有255个字符的限制。只有在通过其 URL 请求页时查询字符串才是可行的选择。  

  

服务器端常见方式

  存储页信息的服务器端选项往往比客户端选项具有更高的安全性,但也利用了更多的 Web 服务器资源。

1: Application:

  利用场合:所有的请求都会需要的一些共有资源,由最先的一个请求率先获取之后,拿出来共享,其他的请求就不用浪费资源进行再次获取。

Send Page: (C#)
Application["strID"]=this.txtFromValue.Text;
Server.Transfer("WebRecieve.aspx");
Receive   Page: (C#)
this.txtRecieve.Text=(string)Application["strID"]; (C#)

Application.Add("name", name)

AddressList = Application.Item("AddressList")

application("intPagetotalNum")=intCount 



  优点:易于实现,全局范围。

  缺点:若保存数据的服务器端进程被强行关闭,那么数据就会丢失,所以利用Application一定要有保底的策略。耗用服务器端资源。

注意:因为Application中的数据被多个进程公用,所以若需要更新其中的值时,需要考虑加锁等:

Application.Lock()

Application.Item("Data") = Data

Application.UnLock()

2:Session:

session模型简介中,session状态应该存储在两个地方,客户端和服务器端。会话状态存储特定于单独会话的短期信息,并且需要较高的安全性。用户过多的话也会影响服务器性能。

Send Page:
Session["Name"]=this.txtFromValue.Text;
Server.Transfer("WebRecieve.aspx");
Receive   Page:
this.txtRecieve.Text=Session["Name"].ToString();


优点:易于实现,持久性,可以应对IIS重启和辅助进程重启,可在多进程中使用

缺点:耗用服务器端的内存。

3: 数据库Database以及XML文件等

  优点:安全性高,容量大,持久性,访问方便。

  缺点:复杂,性能低,耗费服务器资源

 





类别: SoftWare |  评论(0) |  浏览(17632) |  收藏