网上查到了很多类似的问题,但没找到能解决问题的答案用的是 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(),期望这样能锁住整个页面,不知这样可行否。
难点是锁定关闭页面事件;即使这样可行,其他人在访问这个相同页面时,无法给出提示,不符合需求2. 用一个变量 Application["key"] = 0 来标识,每当一个人进入这个页面,就在Page_load()中检测这个值,
如果 Application["key"] = 0 ,Application["key"]加1;
如果 Application["key"] > 0 , 说明有人已经登陆此页面,给出提示
在关闭这个页面的时候 Application["key"]减1,前提也是要捕捉到关闭页面这个事件(直接点击关闭网站的叉),而这个事 件在C#中却没有对应像Page_Load()这样的事件;需要用javascipt来判断这个事件看到网上还有很多其他人也遇到此问题,没有找到答案。希望对此问题作出解决,新手在此谢过~
思路是这样的:
在全局文件里面写入一个timer 控件 每2秒向数据库写入一次时间。当另外一个人来访问的时候 查找这个时间 如果是访问的时间 比查找的时间 大2秒 那么可以访问 如果是 小于等于2秒 就不能访问。
这个 很费资源 慎用!
缺点是关闭页面动作要向服务器发送请求,这个请求无法保证能发出。
这个需求和一个账号只能同时登陆一个客户端类似 。
这个问题的纠结点是 ,http协议是无状态的,客户端还在不在线 ,服务端是无法知道的;我倒是想到一个巧妙的方案,回去再发出来
客户端做一个心跳请求 ,例如 5秒钟请求一次,表示在线;服务端加相对时间过期缓存 ,时间根据心跳时间来定 : 这里设置为 6秒 ;
缓存存储sessionid 、页面标识、访问一个页面时 :
判断有没有 当前页面标识的缓存 ,
如果没有,证明页面当前没有人访问 ,可以访问,添加缓存 ;
如果有 , 看看sessionid是否一样 ,一样可以访问, 不一样,说明有人在访问了 ;
我们把该问题换个说法:拿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状态 握手服务器,记录最新状态,告诉服务器,我还活着呢。