一、Session对象
Session又称回话状态用来表示保存用户的共享的数据的,典型应用有存储用户信息、多网页间信息传递、购物车等。Session产生在服务器端,只能为当前访问的用户服务。以用户对网站的最后一次访问开始计时,当计时达到Timeout设定的时间并且期间没有访问操作时,会话自动断开结束(即使把当前网页关闭了,回话也并非立即断开,必须等到TimeOut时间到了才行)。
注意的是:
1、打开一个新浏览器时,就会产生一个Session。
1)并非打开一个网页就产生也个Session.
2)所谓新浏览器就是:从关闭状态到启动状态的浏览器(可以是同种类型的,也可以是不同种类型的浏览器)
2、客户关闭浏览器下线,出现实际上在线的人数并没有减少的这种现象。(下面会详细讲解)
二、Appllication对象
Application又称应用程序状态,它应用与所有的用户;可以理解为全局变量,网站中的每个访问者均可访问;Application状态在网站运行时存在,网站服务关闭是被释放。
三、两个对象的异同:
四、在Global.asax中代码:
public class Global : System.Web.HttpApplication { //启动程序时,启动 protected voidApplication_Start(object sender, EventArgs e) { } //打开一个浏览器时,建立一次回话 protected voidSession_Start(object sender, EventArgs e) { Session.Timeout = 1; //设置1分钟超时(若没有任何操作) Application.Lock();//上锁,防止多人操作结果不一致的问题 Application["total"] =(int) Application["total"] +1; Application["noline"] = (int) Application["noline"]+ 1; Application.UnLock();//释放加锁,这样其他用户才可对Application对象进行操作。 } //关闭服务时,才可执行。 protected voidSession_End(object sender, EventArgs e) { } //应用程序关闭并不执行此代码,只有正常关闭服务时,才可以执行此代码 protected voidApplication_End(object sender, EventArgs e) { } }
五、简单应用:asp.net 使用Application和Session对象统计在线人数
整个程序的正确运行结果是这样的:
在此例子,中出现了一些较为细节东西,下面和大家一起来学习一下。
问题一:关闭一个浏览器之后,显示的在线人数并没有减少。
原因:当你在客户端关闭浏览器,感觉是客户下线;但是那是只是表面现象。真正的断开连接,当Session.Timeout时间到之后,反应给服务器,这是才算真正的下线成功。这就会经常出现:客户关闭浏览器下线,但实际上在线的人数并没有减少的情况。对于这种情况,一般不做处理即可。超时之后在线人数自然会减少。
问题二:取出Session中的数据引发的问题
为了提高系统的安全性,我们用到了Session,对每个页面都进行了一下安全防护,就是说,不仅只需要只有获取到正确的用户名,其他页面也必须如此,否则提示“非法登录”。这里的用户名“a”;登录页面(WebForm1.aspx);主页面(WebForm2.aspx)。
1)当还没有登录时,从地址栏直接登入主页显示如下,给出错误提示:
没有任何没有问题。
2)当我正常登录时,给出错误提示。
错误分析:因为存入对象里的是Boolean类型的代码,取出时取出的是字符串,引起了我的注意。下面看一下代码:
WebForm1的登录代码:
protected voidButton1_Click(object sender, EventArgs e)
{
//if(True)
if(txtUserName.Text == "a")
{
Session["flag"]= true;
Response.Redirect("WebForm2.aspx");
}
WebForm2欢迎界面:
protected void Page_Load(object sender, EventArgs e)
{
if(Session["flag"] == null ||Session["flag"].ToString() != "true")
{
Response.Write("非法登录!");
}
}
错误改正:
1)方案:
WebForm1的登录代码:
protected voidButton1_Click(object sender, EventArgs e)
{
//if(True)
if(txtUserName.Text == "a")
{
Session["flag"]= "true";
Response.Redirect("WebForm2.aspx");
}
WebForm2欢迎界面:
protected void Page_Load(object sender, EventArgs e)
{
if(Session["flag"] == null ||Session["flag"].ToString() != "true")
{
Response.Write("非法登录!");
}
}
2)方案:
WebForm1的登录代码:
protected voidButton1_Click(object sender, EventArgs e)
{
//if(True)
if(txtUserName.Text == "a")
{
Session["flag"] = true;
Response.Redirect("WebForm2.aspx");
}
WebForm2欢迎界面:
protected void Page_Load(object sender, EventArgs e)
{
if(Session["flag"] == null || (Boolean)Session["flag"]!= true)
{
Response.Write("非法登录!");
}
}
从错误代码到两种解决方案的代码我们可以的出结论:
1)Session是对象类型,可以存储任何类型的数据。
Session["flag"] = "true";
Session["flag"] = true;
取出Session中的值:
Session["flag"].ToString() != "true"
(Boolean) Session["flag"]!= true
2)可以得出,虽然Session中取出的数据都是Object类型的,但是取出的类型还必须跟存入时的类型保持一致,否则会导致错误。也就是说,Session中的数据时Object无可厚非,但是数据还携带自身的类型,所以用的时候,只有转化成自身的类型才可以真正的得到运用。(仅是自己总结,还请各位指导!)