Elijah

治愈系代码研究基地
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[传智播客学习日记]保持HTTP状态的方法

Posted on 2011-12-06 22:29  Elijah  阅读(418)  评论(0编辑  收藏  举报

HTTP协议是“无状态”的协议,但是实际需求当中需要记住用户上一次提交的数据,在WebForm中记录用户状态的方法有ViewState(隐藏域)、Cookie、Session和Application。ViewState很简单,这里只讨论后三种

首先来看Cookie和Session,它们的区别就是一个存在客户端文件里,另一个存在服务端内存中,Session的自动销毁时间默认是20分钟。它们两者都可以通过设置过期时间来销毁。每次用户打开网页,都会携带Cookie或Session的信息发送给服务器。Session在传递的过程中会携带SessionId,这个Id对应一张键值对表存储用户的状态。它们二者在使用上几乎没有什么差别。Application则是跟全局类Global紧密相关的,就像一个只有一个公共厕所的大楼,每次只能进去一个Session,然后上锁,写完数据再解锁,出去。

 1 //Cookie登陆页
2 if (IsPostBack)
3 {
4 //从HTML取用户输入信息
5 string name = txtName.Value;
6 string pwd = txtPwd.Value;
7
8 if (name == "admin" && pwd == "admin")
9 {
10 //记录cookie(键值对)
11 HttpCookie cookie = new HttpCookie("name", name);
12 //设置过期时间(7天)
13 cookie.Expires = DateTime.Now.AddDays(7);
14 //将cookie写入客户机
15 Response.Cookies.Add(cookie);
16 //跳转到指定页
17 Response.Redirect("XXXXXXXXXXX.aspx");
18 }
19 else
20 {
21 //登陆失败
22 }
23 }
24 //跳转后的页面
25 if (Request.Cookies["name"] != null)
26 {
27 //读取cookie
28 string name = Request.Cookies["name"].Value;
29 Response.Write("欢迎:" + name);
30 }
31 //退出登录的一般处理程序
32 public class _05_delete : IHttpHandler {
33
34 public void ProcessRequest (HttpContext context) {
35 context.Response.ContentType = "text/plain";
36
37 int count = context.Request.Cookies.Count;
38 for (int i = 0; i < count; i++)
39 {
40 HttpCookie hc = context.Request.Cookies[i];
41 //设置过期(重写cookie)
42 hc.Expires = DateTime.Now.AddDays(-1);
43
44 context.Response.Cookies.Add(hc);
45 }
46
47 context.Response.Redirect("XXXXXXXXXXX");
48 }
49
50 public bool IsReusable {
51 get {
52 return false;
53 }
54 }
55
56 }

 

 1 //Session登陆页
2 if (IsPostBack)
3 {
4 string name = txtName.Value;
5 string pwd = txtPwd.Value;
6
7 if (name == "admin" && pwd == "admin")
8 {
9 Session["name"] = name;
10 //设置过期时间,默认是最后一次请求后20分钟
11 Session.Timeout = 1;
12 Response.Redirect("XXXXXXXXXXX.aspx");
13 }
14 else
15 {
16 //登陆失败
17 }
18 }
19 //跳转后的页面
20 if (!IsPostBack)
21 {
22 if (Session["name"] != null)
23 {
24 Response.Write(Session["name"].ToString() + " 登陆成功");
25 Response.Write("<br> " + Session.SessionID);
26 }
27 }
28 //退出登录的一般处理程序
29 public class _08_exit : IHttpHandler, System.Web.SessionState.IRequiresSessionState
30 {
31 public void ProcessRequest (HttpContext context) {
32 context.Response.ContentType = "text/plain";
33 //清除服务器的session
34 context.Session.Abandon();
35 context.Response.Redirect("XXXXXXXXXXX.aspx");
36 }
37
38 public bool IsReusable {
39 get {
40 return false;
41 }
42 }
43
44 }


使用application记录同时在线人数的案例:

 1 //在Global.asax中:
2 void Application_Start(object sender, EventArgs e)
3 {
4 // 在应用程序启动时运行的代码
5 Application.Lock();
6 Application["count"] = 0;
7 Application.UnLock();
8 }
9 void Session_Start(object sender, EventArgs e)
10 {
11 // 在新会话启动时运行的代码
12 Application.Lock();
13 Application["count"] = Convert.ToInt32(Application["count"]) + 1;
14 Application.UnLock();
15 }
16 void Session_End(object sender, EventArgs e)
17 {
18 // 在会话结束时运行的代码。
19 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。
20 // 如果会话模式设置为 StateServer
21 // 或 SQLServer,则不会引发该事件。
22
23 Application.Lock();
24 Application["count"] = Convert.ToInt32(Application["count"]) - 1;
25 Application.UnLock();
26 }
27
28 //主页面:
29 protected void Page_Load(object sender, EventArgs e)
30 {
31 Response.Write("人数:" + Application["count"]);
32 }