.NET状态保持(一)

在WEB开发中很多场景需要用到状态保持机制,在最近的复习重新学习中我发现大多人对状态保持的几种手段的概念有点模糊,在这里我综合了几位博主和大牛的文章我在这里使用简要的语言解释下,不喜勿喷 如有错误请大家指出批评

 

总体来说在ASP.NET开发中常用的状态的保存机制无非就那么几种

一、前端隐藏域方法

   1 <input type="hidden" name="隐藏域" value="" /> 

  这种手段具体的实现就是在前端页面使用隐藏域来保持状态,隐藏域在浏览器页面是肉眼是无法看到的, 但并非是不存在,他是确确实实存在页面中的 进行源代码查看即可看到

  但我们可以给它的Value进行赋值,当提交页面表单到服务端时他的值像其他表单标签一样传送到HTTP Form集合中,

  实例:实现数值累加返回:

  ASPX代码:

  

 <input type="hidden" name="隐藏域" value="<%=IntAdd %>" />

  服务端代码:

  

 public int IntAdd { get; set; }
 protected void Page_Load(object sender, EventArgs e)
 {
     int num;
     if (int.TryParse(Request.Form["隐藏域"],out num))
     {
        num++;
        IntAdd = num;
     }

 }

二、ViewState隐藏域

  Viewstate 本质上也是隐藏域,只不过是由服务端生成的隐藏域!这种方法一般现在很少用 因为使用ViewState的前提是form表单属性中必须包含 runat="Server" 

  他是把具体的数据以base64编码形式保存在生成的隐藏域value

  赋值方法:  

//保存信息
ViewState.Add(“name”,”username”);
fi获取信息
string shapes=ViewState[“name”]; 

  同时VIewState不仅仅包含这些 还保存 数据的传输方式所以我们在判断是否Post传值时可以使用

  IsPostBack   //如果是POST传值则返回true 否则返回false

  另外咋使用Viewstate时应该注意避免将大量数据存入 避免使用服务端控件 使用服务端控件服务端的控件的具体设置和值都会保存在VIEWSTATE的隐藏域中导致浏览器渲染页面变慢

三、Cookie

     Cookie对于很多初学者来说不知道它是个什么玩意儿。大多把他当做浏览器缓存。

  Cookie是一段明文文本,是伴随浏览器请求时和页面 在服务端和浏览器两者之间进行传递 Cookie包含每次用户访问站点时 Web 应用程序都可以读取的信息。 它保存在浏览器内存或者客户端磁盘上,由此我们可知Cookie是不安全的故不可吧安全敏感信息放进cookie中

  那么会有人问  为什么他不安全还有用它  因为http协议是无状态的 对浏览器的请求 web服务器是不知道是哪个浏览器发送来的请求 所以,需要额外的数据用于维护会话。 Cookie 正是这样的一段随HTTP请求一起被传递的额外数据。

Cookie 的限制。 大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

通过前面的内容,我们了解到Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。 下面本文将按这个过程看看Cookie是如何从服务端写入,最后如何传到服务端以及如何读取的。

  ASP.NET写入Cookie的方式有两种

  1)

 Response.Cookies["userName"].Value ="user";
 //Cookie是以键值对的形式保存的
 Response.Cookies["userName"].Expires = DateTime.Now.AddDays(7);
 //可以为COOkie设置过期时间

  2)

1 HttpCookie cookie = new HttpCookie("MyCookieName", "string value");//设置COOKIE名称和值
2 cookie.Expires = DateTime.Now.AddDays(7);//设置COOKIE七天后过期
3 Response.Cookies.Add(cookie);//返回给浏览器

  具体是如何给浏览器的我们通过响应头来看下

  

  服务端获取COOkie

HttpCookie cookie = Request.Cookies["MyCookieName"];
if (cookie!=null)
{
    MyName = cookie.Value;
}

 

  我们再来看下服浏览器是如何把Cookie传送回服务端的

从图片中,我们可以发现,Cookie是放在请求头中,发送到服务端的。如果你一直刷新页面,就能发现, 每次HTTP请求,Cookie都会被发送。当然了,浏览器也不是发送它所接收到的所有Cookie,它会检查当前要请求的域名以及目录, 只要这二项目与Cookie对应的Domain和Path匹配,才会发送。对于Domain则是按照尾部匹配的原则进行的。
所以,我在访问 京东时,浏览器并不会将我在浏览 淘宝时 所接收到的 Cookie 发给京东。

删除 COOkie事实上就是把COOKIE的时间重新设置到历史时间(早于现在的时间即可)

posted @ 2015-07-27 15:03  刘_腾飞  阅读(140)  评论(0)    收藏  举报