[传智播客学习日记]保持HTTP状态的方法
2011-12-06 22:29
525 查看
HTTP协议是“无状态”的协议,但是实际需求当中需要记住用户上一次提交的数据,在WebForm中记录用户状态的方法有ViewState(隐藏域)、Cookie、Session和Application。ViewState很简单,这里只讨论后三种
首先来看Cookie和Session,它们的区别就是一个存在客户端文件里,另一个存在服务端内存中,Session的自动销毁时间默认是20分钟。它们两者都可以通过设置过期时间来销毁。每次用户打开网页,都会携带Cookie或Session的信息发送给服务器。Session在传递的过程中会携带SessionId,这个Id对应一张键值对表存储用户的状态。它们二者在使用上几乎没有什么差别。Application则是跟全局类Global紧密相关的,就像一个只有一个公共厕所的大楼,每次只能进去一个Session,然后上锁,写完数据再解锁,出去。
使用application记录同时在线人数的案例:
首先来看Cookie和Session,它们的区别就是一个存在客户端文件里,另一个存在服务端内存中,Session的自动销毁时间默认是20分钟。它们两者都可以通过设置过期时间来销毁。每次用户打开网页,都会携带Cookie或Session的信息发送给服务器。Session在传递的过程中会携带SessionId,这个Id对应一张键值对表存储用户的状态。它们二者在使用上几乎没有什么差别。Application则是跟全局类Global紧密相关的,就像一个只有一个公共厕所的大楼,每次只能进去一个Session,然后上锁,写完数据再解锁,出去。
//Cookie登陆页 if (IsPostBack) { //从HTML取用户输入信息 string name = txtName.Value; string pwd = txtPwd.Value; if (name == "admin" && pwd == "admin") { //记录cookie(键值对) HttpCookie cookie = new HttpCookie("name", name); //设置过期时间(7天) cookie.Expires = DateTime.Now.AddDays(7); //将cookie写入客户机 Response.Cookies.Add(cookie); //跳转到指定页 Response.Redirect("XXXXXXXXXXX.aspx"); } else { //登陆失败 } } //跳转后的页面 if (Request.Cookies["name"] != null) { //读取cookie string name = Request.Cookies["name"].Value; Response.Write("欢迎:" + name); } //退出登录的一般处理程序 public class _05_delete : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; int count = context.Request.Cookies.Count; for (int i = 0; i < count; i++) { HttpCookie hc = context.Request.Cookies[i]; //设置过期(重写cookie) hc.Expires = DateTime.Now.AddDays(-1); context.Response.Cookies.Add(hc); } context.Response.Redirect("XXXXXXXXXXX"); } public bool IsReusable { get { return false; } } }
//Session登陆页 if (IsPostBack) { string name = txtName.Value; string pwd = txtPwd.Value; if (name == "admin" && pwd == "admin") { Session["name"] = name; //设置过期时间,默认是最后一次请求后20分钟 Session.Timeout = 1; Response.Redirect("XXXXXXXXXXX.aspx"); } else { //登陆失败 } } //跳转后的页面 if (!IsPostBack) { if (Session["name"] != null) { Response.Write(Session["name"].ToString() + " 登陆成功"); Response.Write("<br> " + Session.SessionID); } } //退出登录的一般处理程序 public class _08_exit : IHttpHandler, System.Web.SessionState.IRequiresSessionState { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; //清除服务器的session context.Session.Abandon(); context.Response.Redirect("XXXXXXXXXXX.aspx"); } public bool IsReusable { get { return false; } } }
使用application记录同时在线人数的案例:
//在Global.asax中: void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 Application.Lock(); Application["count"] = 0; Application.UnLock(); } void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码 Application.Lock(); Application["count"] = Convert.ToInt32(Application["count"]) + 1; Application.UnLock(); } void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。 // 如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 Application.Lock(); Application["count"] = Convert.ToInt32(Application["count"]) - 1; Application.UnLock(); } //主页面: protected void Page_Load(object sender, EventArgs e) { Response.Write("人数:" + Application["count"]); }
相关文章推荐
- Java Web 学习笔记之二:Java HttpURLConnection保持会话的方法
- [传智播客学习日记]DOM中的基本window方法、属性及事件
- [传智播客学习日记]从子窗口传值给父窗口的两种方法(接口和委托)
- Android学习之保持屏幕常亮的几种方法
- 类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们的问题的解决方法 续集
- 保持学习状态——2013总结(工作、职场)
- 传智播客学习日记Day2
- [传智播客学习日记]有利于SEO的基本原则
- Android开发学习日记1-button触发的三种方法
- nodejs学习日记之http模块(一)
- TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
- 又不在状态?来看看程序员保持动力的9种方法
- 如何在HTTP客户端与服务器端之间保持状态
- 传智播客学习视频之HTTP协议详解(一)
- http头状态信息意议以及在php使用header设置方法
- [学习日记]对SOAP请求的头添加内容的方法
- JavaScript学习总结(七)Ajax和Http状态字
- ApxGridView学习日记 080605 Edit(编辑)的时候 出现英文update和cancel 改成中文的方法
- OC学习日记-继承,多态,私有属性、变量和方法,self,super,属性修饰符,description
- Android学习 (十六) 用HttpURLConnection方法发送一个HTTP请求