网上查到了很多类似的问题,但没找到能解决问题的答案用的是 ASP.NET + C#问题描述:
某个用户访问一个页面;希望其他用户访问同一个页面时,能给出提示:已有人在访问此页面我的想法:
1. 在page_load中 用 Application.lock(),关闭页面时Application.unlock(),期望这样能锁住整个页面,不知这样可行否。
   难点是锁定关闭页面事件;即使这样可行,其他人在访问这个相同页面时,无法给出提示,不符合需求2. 用一个变量 Application["key"] = 0 来标识,每当一个人进入这个页面,就在Page_load()中检测这个值,
   如果 Application["key"] = 0 ,Application["key"]加1;
   如果 Application["key"] > 0 , 说明有人已经登陆此页面,给出提示
   在关闭这个页面的时候 Application["key"]减1,前提也是要捕捉到关闭页面这个事件(直接点击关闭网站的叉),而这个事  件在C#中却没有对应像Page_Load()这样的事件;需要用javascipt来判断这个事件看到网上还有很多其他人也遇到此问题,没有找到答案。希望对此问题作出解决,新手在此谢过~

解决方案 »

  1.   

    楼主还是考虑用java实现吧。java之王能实现这个功能。
      

  2.   

    一个比较粗笨的方法,在页面设置一个静态的Flag,当有人访问的时候,falg设置为true,当他退出页面的时候,即卸载页面的时候,将flag设置为false,所以这样就别人在载入这个页面的时候,就可以给予提示了
      

  3.   

    在客户端存入一个guid值,写到cookie里,同时也存到数据库里(还要加上其活动时间)在这个页面顶部进行判断,如果是其他人,在限定的时间内,如5分钟,则Response.End(),否则输出页面如果是本人,则直接输出。输出页面内容时,要将Guid值也存到数据库和cookie里。这是我能想到的解决办法,但这个办法不太靠谱,很容易出现同时访问,同时写入多个值的情况
      

  4.   

    写一个BasePage 然后所有页面都继承BasePage这个类,最后再这个类里做文章,就可以了。
      

  5.   

    在客户端写一个js方法,并且让这个方法每隔5秒执行一次,这个js方法里调用一个WebService方法,WebService里记录活动状态其他用户访问这个页面时,只有在(5+网络延时)秒内没有活动状态记录,才允许访问
      

  6.   

    嘿嘿 这个 我还真做过 在全局文件里面 但是会影响性能 测试完全能通过。
    思路是这样的:
    在全局文件里面写入一个timer 控件 每2秒向数据库写入一次时间。当另外一个人来访问的时候 查找这个时间 如果是访问的时间 比查找的时间 大2秒 那么可以访问 如果是 小于等于2秒  就不能访问。
    这个 很费资源 慎用!
      

  7.   

    不用考虑页面关闭事件了,用活动间隔来处理吧,建议接管request(httpmodle),然后处理请求页面,实现方式标示符来处理就行了,客户端做个心跳包吧。
      

  8.   

    各位,给点建议好了,看了一下回复,觉得挺打击新人积极性的,这个问题,确实不容易处理,要考虑客户何时离开页面,正常离开还好,可以通过js判断,但万一电脑爆炸,断电,这个就不好弄了。客户端ajax每秒访问一次服务器,这时候生成的sessionid是不变的,把SessionID记录到application,这时再通过ajax通信返回页面内容。另外一个客户端过来的时候,判断sessionid和application里的是否一致,不一致就把页面内容清掉。
      

  9.   

    楼主的方案2是可行的  ,
    缺点是关闭页面动作要向服务器发送请求,这个请求无法保证能发出。
    这个需求和一个账号只能同时登陆一个客户端类似 。
    这个问题的纠结点是 ,http协议是无状态的,客户端还在不在线 ,服务端是无法知道的;我倒是想到一个巧妙的方案,回去再发出来
      

  10.   

    session 相对时间过期 ,例如20分钟 ,
    客户端做一个心跳请求 ,例如 5秒钟请求一次,表示在线;服务端加相对时间过期缓存  ,时间根据心跳时间来定 : 这里设置为 6秒 ;
    缓存存储sessionid 、页面标识、访问一个页面时 :
    判断有没有 当前页面标识的缓存 ,
    如果没有,证明页面当前没有人访问 ,可以访问,添加缓存  ;
    如果有 , 看看sessionid是否一样  ,一样可以访问, 不一样,说明有人在访问了 ;
      

  11.   

       这个东西其实很好解决,我们先抛开http协议的特殊性来看问题:
       我们把该问题换个说法:拿winform来说,每次只允许打开一个窗口(Form),那么我们应该怎么做呢?
    我们把这个不可重复打开的窗口叫做 "窗口A" ,在窗口Show()之前,我们应该有一个全局变量来记录,整个窗体是否已经打开,如果没有打开,那么我们就打开,如果已经打开,那么我们应该做相应提示。   好了,现在我们来讲一下HTTP协议的单向通信的特性。
    web与winform的最大区别就是,Web客户端每次向服务端发送请求获取数据,一旦请求完毕,服务器根本不知道他是死是活。
       那么,我们如何解决这个问题呢?
       楼上说的很好,说道了"心跳"
    这时我们就需要用js来模拟客户端心跳,页面打开后,每个5秒或10秒来向服务器握手,告诉服务器,我当前访问的是"人力资源管理"页面,我还活着,请记住我。
       现在我写一个简单的流程代码给你看下, 
     
       hrState:人力资源页面状态。
      //以下代码写在pageload里
       if(hrState==null)
        {
          hrState=new hrState();
          hrState.Name=="张三";
          hrState.DateTime= "2012-08-05 01:08";
        }
       else
       {
         //这里说明上一个访问该页面的人是否已经死了。
         if(hrState.DateTime加5秒 < 现在的时间)
            {
               
                //把当前页面的新主人记录下来。
             }
         else
             {
               //上一个访问该页面的主人还活着
              messagebox("该页面已经在别的用户打开,请求失败!");
            }
        } 
    该代码写好之后只能保证 单用户登录,但是话说回来,由于HTTP的特殊性,我们得做一个心跳。
    这个心跳应该写在页面的js里,用js定时器 每隔5秒 用ajax 异步刷新hrState状态 握手服务器,记录最新状态,告诉服务器,我还活着呢。