Server和Application对象

一、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无可厚非,但是数据还携带自身的类型,所以用的时候,只有转化成自身的类型才可以真正的得到运用。(仅是自己总结,还请各位指导!)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值