当前位置:编程学习 > C#/ASP.NET >>

怎么控制同一个页面同时只允许一个人打开使用

网上查到了很多类似的问题,但没找到能解决问题的答案

用的是 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. 在page_load中 用 Application.lock(),关闭页面时Application.unlock(),期望这样能锁住整个页面,不知这样可行否。


怪诞逻辑,不知道你的根据是什么,你是否写程序测试过? --------------------编程问答-------------------- 楼主还是考虑用java实现吧。

java之王能实现这个功能。 --------------------编程问答--------------------
引用 1 楼  的回复:
引用楼主 的回复:
1. 在page_load中 用 Application.lock(),关闭页面时Application.unlock(),期望这样能锁住整个页面,不知这样可行否。

怪诞逻辑,不知道你的根据是什么,你是否写程序测试过?

之前没接触过关于网站的,刚学,我也是就着虚心的态度来请教问题的,
就这个问题有什么好的建议么?谢谢 --------------------编程问答-------------------- 可以通过写入数据库 来判断 用一个字段锁住 离开解锁 但是得考虑意外关闭的零界情况. --------------------编程问答-------------------- 实现这个功能用到数据库的话,感觉问题复杂化了 --------------------编程问答--------------------

除非你把页面地址保存。然后加状态!

太荒谬的需求! --------------------编程问答-------------------- 一个比较粗笨的方法,在页面设置一个静态的Flag,当有人访问的时候,falg设置为true,当他退出页面的时候,即卸载页面的时候,将flag设置为false,所以这样就别人在载入这个页面的时候,就可以给予提示了。。。 --------------------编程问答-------------------- 在客户端存入一个guid值,写到cookie里,同时也存到数据库里(还要加上其活动时间)

在这个页面顶部进行判断,如果是其他人,在限定的时间内,如5分钟,则Response.End(),否则输出页面

如果是本人,则直接输出。

输出页面内容时,要将Guid值也存到数据库和cookie里。

这是我能想到的解决办法,但这个办法不太靠谱,很容易出现同时访问,同时写入多个值的情况 --------------------编程问答-------------------- 写一个BasePage 然后所有页面都继承BasePage这个类,最后再这个类里做文章,就可以了。 --------------------编程问答-------------------- 支持楼上的! --------------------编程问答-------------------- 考虑考虑用线程实现此功能! --------------------编程问答-------------------- 在客户端写一个js方法,并且让这个方法每隔5秒执行一次,这个js方法里调用一个WebService方法,WebService里记录活动状态

其他用户访问这个页面时,只有在(5+网络延时)秒内没有活动状态记录,才允许访问 --------------------编程问答-------------------- 嘿嘿 这个 我还真做过 在全局文件里面 但是会影响性能 测试完全能通过。
思路是这样的:
在全局文件里面写入一个timer 控件 每2秒向数据库写入一次时间。当另外一个人来访问的时候 查找这个时间 如果是访问的时间 比查找的时间 大2秒 那么可以访问 如果是 小于等于2秒  就不能访问。
这个 很费资源 慎用! --------------------编程问答-------------------- 第二个方案是可行的,难点在于关闭网页后-1
关闭网页事件可以用js事件捕获。 --------------------编程问答-------------------- 不用考虑页面关闭事件了,用活动间隔来处理吧,建议接管request(httpmodle),然后处理请求页面,实现方式标示符来处理就行了,客户端做个心跳包吧。 --------------------编程问答-------------------- 貌似不行的。什么鬼需求只能有一个人访问。页面非正常关闭的话,你的状态就失效了。 --------------------编程问答-------------------- 各位,给点建议好了,看了一下回复,觉得挺打击新人积极性的,这个问题,确实不容易处理,要考虑客户何时离开页面,正常离开还好,可以通过js判断,但万一电脑爆炸,断电,这个就不好弄了。

客户端ajax每秒访问一次服务器,这时候生成的sessionid是不变的,把SessionID记录到application,这时再通过ajax通信返回页面内容。另外一个客户端过来的时候,判断sessionid和application里的是否一致,不一致就把页面内容清掉。 --------------------编程问答-------------------- 楼主的方案2是可行的  ,
缺点是关闭页面动作要向服务器发送请求,这个请求无法保证能发出。


这个需求和一个账号只能同时登陆一个客户端类似 。


这个问题的纠结点是 ,http协议是无状态的,客户端还在不在线 ,服务端是无法知道的;



我倒是想到一个巧妙的方案,回去再发出来
--------------------编程问答-------------------- session 相对时间过期 ,例如20分钟 ,
客户端做一个心跳请求 ,例如 5秒钟请求一次,表示在线;

服务端加相对时间过期缓存  ,时间根据心跳时间来定 : 这里设置为 6秒 ;
缓存存储sessionid 、页面标识、

访问一个页面时 :
判断有没有 当前页面标识的缓存 ,
如果没有,证明页面当前没有人访问 ,可以访问,添加缓存  ;
如果有 , 看看sessionid是否一样  ,一样可以访问, 不一样,说明有人在访问了 ;

--------------------编程问答--------------------    这个东西其实很好解决,我们先抛开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状态 握手服务器,记录最新状态,告诉服务器,我还活着呢。。。。。。。
--------------------编程问答-------------------- 怪诞的需求,为什么叫互联网?撸过~~
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,