什么是阻止页面上多个用户的最佳方法?
例如,如果用户位于“Home.aspx”页面,则不允许其他用户去那里。
我在服务器上使用asp.net,在客户端使用js-frameword jQuery。
答案 0 :(得分:8)
简单的部分只允许一个用户访问页面。例如,您可以将会话ID存储在应用程序变量中,以跟踪页面上的人员。
困难的部分是知道用户何时离开页面。 HTTP协议仅处理请求,因此服务器只知道用户何时进入页面。协议中的页面没有“存在”的概念。
您可以在客户端代码中使用onunload
事件来捕获用户何时去其他地方,但这并不总是有效。如果用户丢失了互联网连接,则无法与用户离开页面的服务器进行通信。如果浏览器或计算机崩溃,则自然不会发生onunload
事件。
您可以继续从服务器请求数据,例如在页面上重新加载图像。这样,服务器可以以特定间隔知道用户是否仍在页面上。但是,如果用户丢失了互联网连接,服务器将认为用户已离开,而用户认为他/她仍然在页面上。
另一个问题是浏览器历史记录和缓存。用户可能会离开页面,然后再次返回页面。您必须确保页面未被缓存,或者浏览器将仅使用缓存页面,并且服务器不知道用户认为他/她再次在页面上。
答案 1 :(得分:3)
与Guffa同意,您无法确定浏览器是否已在页面上,您只能检查浏览器是否已连接到该页面。
你可以做一种“ping”,但它比100%工作解决方案更具技巧,它需要启用javascript。
我没有这样做,但我应该看看XMLHTTPRequest和onreadystatechange来处理这个问题:
1)在页面加载时,浏览器(客户端)使用网站(服务器)启动XMLHTTPRequest,然后等待onreadystatechange事件的回调。
2)网站收到请求并使用当前DateTime.Now“标记”该页面为“正在使用中”。
3)然后网站发送回复。
4)onreadystatechange事件获取响应,事件代码重新请求服务器在1分钟后重新启动2.
5)如果另一个客户端请求该页面,服务器检查DateTime标记:如果该标记大于1分钟前,则表示客户端没有响应该请求,可能不会再次出现在该页面上。
答案 2 :(得分:2)
不确定为什么要这么做,因为它面对网络可用性。您可以在服务器端代码中的每个页面上执行锁定机制(将用户名,页面和时间写入数据库),这些机制在转到另一个页面时会被释放。然后,您将检查页面加载事件,以确定当前是否有人锁定了该页面。然而,这是一个很大的问题 - 你是否考虑过如果某人只是关闭浏览器或者离开它并将其留在页面上会发生什么。您还需要认真考虑超时以释放锁定。这需要是一个背景服务,无论是在global.asax中作为全局代码还是单独的过程。
答案 3 :(得分:-1)
也许使用静态变量来保存第一个用户访问该页面的ip,然后检查其他请求是否来自同一个ip,否则显示“无访问”页面。
确保你使用锁定它:
Object thisLock = new Object();
lock (thisLock)
{
// access static variables
}
您还应该使用global.asax中的“Session_End”方法删除IP地址,以防用户离开您的网站而不按下注销按钮