zoukankan      html  css  js  c++  java
  • [传智播客学习日记]保持HTTP状态的方法

    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 }



  • 相关阅读:
    使用自己的key对app进行签名
    pl/sql中文乱码解决办法
    Oracle存储过程中创建表的权限
    pl/sql中获得sql语句执行后影响的行数
    申请Android Map APIKey
    vs快捷键
    ODAC安装配置与使用详解
    .net不安装Oracle11g客户端直接使用ODAC
    android通过USB使用真机调试程序
    pl/sql中实现字符串分割
  • 原文地址:https://www.cnblogs.com/Elijah/p/2278576.html
Copyright © 2011-2022 走看看