日期:2014-05-16  浏览次数:20322 次

怎么控制只能有一个浏览器窗口打开某个网页
如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。

描述可能比较绕,我举个例子。

做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。

如何实现,请具体指教。
PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了:
一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器;
二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。

重分悬赏,如果发错区,请版主移动,谢谢。
cookie 浏览器 聊天

------解决方案--------------------
如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记
------解决方案--------------------
想实现这种功能用session、cookie这种方式肯定是不行的,cookie解决不了跨浏览器的问题,session解决不了客户端关闭的问题,必须得用flash或者websocket这种能保持长链接的技术在服务器记录当前机器已经打开这个地址了,这样才能保证
------解决方案--------------------
1.服务器端设置用户在线状态(用户名+ip+session) ,可以用唯一cookie记录当前页面.在其他页面或者其他浏览器页面打开,根据用户在线状态进行提示(但没法直接切换到指定窗口)。
2.浏览器端定时与服务器端“交流”,服务器端在期望时间内没有收到浏览器端信息则认为用户已下线,初始化各种状态(用户可以再次进入)
------解决方案--------------------
通过页面打开的时间和用户的ID标识一个特定的页面,通过js获取页面打开的时间,在更新消息的同时发送这个打开页面的时间。这样的话如果再打开一个页面的话,就会发送不同的打开页面时间,这样就能区别不同的页面了。如果服务器同时受到两个带有不同页面打开时间的消息更新请求,那么只响应那个页面打开时间较早的。但是在打开页面之前可能需要等待1个消息刷新周期那么长的时间,不知道怎么避免这个,毕竟这会影响用户体验的,但是是否会出现这个问题我不太确定。

可能有点想当然了,不知道有没有漏洞。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。

描述可能比较绕,我举个例子。

做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。

如何实现,请具体指教。
PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了:
一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器;
二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。

重分悬赏,如果发错区,请版主移动,谢谢。

cookie 可以解决
假定 打开页面后 设置一个 在cookie中设置一个key 他的值是当前时间
每间隔 1秒  刷新时间

页面 开始 要判断 这个key是否存在
不存在 表示没有 打开页面
存在 则看 他的值的时间 和 当前时间 相差多少 相差很少 1秒的话 有理由认为 有一个页面已经打开了
那么跳转其他页面
否则 正常开始


感觉有点啰嗦 


还是这个问题,如果相差少于一秒,是判断页面已经打开这是第二次打开。还是判断为刚刚关闭了页面又重新打开了这个页面?

你页面 如果打开着
那么 那个cookie里面的数值 每秒换一次
所以你 间隔1秒检查 1次 就知道有没有其他人在动了
办法是很多的
------解决方案--------------------
引用:
Quote: 引用:

如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记

那如果用户打开这个页面,我记录了session,用户又关闭了这个页面,session还在,他就不能再次打开这个页面了。


重新打开时踢掉之前的session就行,这样最简单。
要么页面关闭时用onunload清掉服务端session,但是还不够,你要考虑异常关闭以及断网的情况。
再或者你做一个“心跳包”的东西,客服端每隔几秒向服务端发信息表示还在线。。。