您的位置:首页 > 理论基础 > 计算机网络

[传智播客学习日记]保持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,然后上锁,写完数据再解锁,出去。

//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"]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐