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

WithoutMe2012 2012-08-02 11:55:32
网上查到了很多类似的问题,但没找到能解决问题的答案

用的是 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来判断这个事件

看到网上还有很多其他人也遇到此问题,没有找到答案。希望对此问题作出解决,新手在此谢过~
...全文
1578 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
happytonice 2012-08-05
  • 打赏
  • 举报
回复
怪诞的需求,为什么叫互联网?撸过~~
Yon2068 2012-08-05
  • 打赏
  • 举报
回复
这个东西其实很好解决,我们先抛开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状态 握手服务器,记录最新状态,告诉服务器,我还活着呢。。。。。。。
winner2050 2012-08-03
  • 打赏
  • 举报
回复
楼主还是考虑用java实现吧。

java之王能实现这个功能。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
1. 在page_load中 用 Application.lock(),关闭页面时Application.unlock(),期望这样能锁住整个页面,不知这样可行否。[/Quote]

怪诞逻辑,不知道你的根据是什么,你是否写程序测试过?
Yon2068 2012-08-03
  • 打赏
  • 举报
回复
写一个BasePage 然后所有页面都继承BasePage这个类,最后再这个类里做文章,就可以了。
robake 2012-08-03
  • 打赏
  • 举报
回复
在客户端存入一个guid值,写到cookie里,同时也存到数据库里(还要加上其活动时间)

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

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

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

这是我能想到的解决办法,但这个办法不太靠谱,很容易出现同时访问,同时写入多个值的情况
linagxiaojing 2012-08-03
  • 打赏
  • 举报
回复
一个比较粗笨的方法,在页面设置一个静态的Flag,当有人访问的时候,falg设置为true,当他退出页面的时候,即卸载页面的时候,将flag设置为false,所以这样就别人在载入这个页面的时候,就可以给予提示了。。。
ycproc 2012-08-03
  • 打赏
  • 举报
回复


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

太荒谬的需求!
WithoutMe2012 2012-08-03
  • 打赏
  • 举报
回复
实现这个功能用到数据库的话,感觉问题复杂化了
天下如山 2012-08-03
  • 打赏
  • 举报
回复
可以通过写入数据库 来判断 用一个字段锁住 离开解锁 但是得考虑意外关闭的零界情况.
WithoutMe2012 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
引用楼主 的回复:
1. 在page_load中 用 Application.lock(),关闭页面时Application.unlock(),期望这样能锁住整个页面,不知这样可行否。

怪诞逻辑,不知道你的根据是什么,你是否写程序测试过?
[/Quote]
之前没接触过关于网站的,刚学,我也是就着虚心的态度来请教问题的,
就这个问题有什么好的建议么?谢谢
地菜 2012-08-03
  • 打赏
  • 举报
回复
session 相对时间过期 ,例如20分钟 ,
客户端做一个心跳请求 ,例如 5秒钟请求一次,表示在线;

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

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

地菜 2012-08-03
  • 打赏
  • 举报
回复
楼主的方案2是可行的 ,
缺点是关闭页面动作要向服务器发送请求,这个请求无法保证能发出。


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


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



我倒是想到一个巧妙的方案,回去再发出来
wszhoho 2012-08-03
  • 打赏
  • 举报
回复
各位,给点建议好了,看了一下回复,觉得挺打击新人积极性的,这个问题,确实不容易处理,要考虑客户何时离开页面,正常离开还好,可以通过js判断,但万一电脑爆炸,断电,这个就不好弄了。

客户端ajax每秒访问一次服务器,这时候生成的sessionid是不变的,把SessionID记录到application,这时再通过ajax通信返回页面内容。另外一个客户端过来的时候,判断sessionid和application里的是否一致,不一致就把页面内容清掉。
酷儿 2012-08-03
  • 打赏
  • 举报
回复
貌似不行的。什么鬼需求只能有一个人访问。页面非正常关闭的话,你的状态就失效了。
wzn1987 2012-08-03
  • 打赏
  • 举报
回复
不用考虑页面关闭事件了,用活动间隔来处理吧,建议接管request(httpmodle),然后处理请求页面,实现方式标示符来处理就行了,客户端做个心跳包吧。
gzpepco 2012-08-03
  • 打赏
  • 举报
回复
第二个方案是可行的,难点在于关闭网页后-1
关闭网页事件可以用js事件捕获。
peng2739956 2012-08-03
  • 打赏
  • 举报
回复
嘿嘿 这个 我还真做过 在全局文件里面 但是会影响性能 测试完全能通过。
思路是这样的:
在全局文件里面写入一个timer 控件 每2秒向数据库写入一次时间。当另外一个人来访问的时候 查找这个时间 如果是访问的时间 比查找的时间 大2秒 那么可以访问 如果是 小于等于2秒 就不能访问。
这个 很费资源 慎用!
langmafeng 2012-08-03
  • 打赏
  • 举报
回复
在客户端写一个js方法,并且让这个方法每隔5秒执行一次,这个js方法里调用一个WebService方法,WebService里记录活动状态

其他用户访问这个页面时,只有在(5+网络延时)秒内没有活动状态记录,才允许访问
hudelan 2012-08-03
  • 打赏
  • 举报
回复
考虑考虑用线程实现此功能!
加载更多回复(1)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧