怎么控制只能有一个浏览器窗口打开某个网页

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

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

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

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

重分悬赏,如果发错区,请版主移动,谢谢。
...全文
1255 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
liphee 2013-10-15
  • 打赏
  • 举报
回复
引用 22 楼 Left_you 的回复:
[quote=引用 8 楼 liphee 的回复:] [quote=引用 4 楼 goinni 的回复:] 如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记
那如果用户打开这个页面,我记录了session,用户又关闭了这个页面,session还在,他就不能再次打开这个页面了。[/quote] 重新打开时踢掉之前的session就行,这样最简单。 要么页面关闭时用onunload清掉服务端session,但是还不够,你要考虑异常关闭以及断网的情况。 再或者你做一个“心跳包”的东西,客服端每隔几秒向服务端发信息表示还在线。。。[/quote] 我现在有了个思路,是服务器端判断,既然是聊天,肯定有向服务器发送状态的进程,所以我只需要判断他在线,就不让他再打开了。不要cookie,解决跨浏览器问题。
liphee 2013-10-15
  • 打赏
  • 举报
回复
引用 21 楼 KK3K2005 的回复:
[quote=引用 20 楼 liphee 的回复:] [quote=引用 19 楼 KK3K2005 的回复:] [quote=引用 楼主 liphee 的回复:] 如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。 描述可能比较绕,我举个例子。 做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。 如何实现,请具体指教。 PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了: 一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器; 二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。 重分悬赏,如果发错区,请版主移动,谢谢。
cookie 可以解决 假定 打开页面后 设置一个 在cookie中设置一个key 他的值是当前时间 每间隔 1秒 刷新时间 页面 开始 要判断 这个key是否存在 不存在 表示没有 打开页面 存在 则看 他的值的时间 和 当前时间 相差多少 相差很少 1秒的话 有理由认为 有一个页面已经打开了 那么跳转其他页面 否则 正常开始 感觉有点啰嗦 [/quote] 还是这个问题,如果相差少于一秒,是判断页面已经打开这是第二次打开。还是判断为刚刚关闭了页面又重新打开了这个页面?[/quote] 你页面 如果打开着 那么 那个cookie里面的数值 每秒换一次 所以你 间隔1秒检查 1次 就知道有没有其他人在动了 办法是很多的[/quote] cookie的值更改,只有在网页再次加载的时候才能使用,不是说立马就能用的。
Left_you 2013-10-14
  • 打赏
  • 举报
回复
引用 8 楼 liphee 的回复:
[quote=引用 4 楼 goinni 的回复:] 如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记
那如果用户打开这个页面,我记录了session,用户又关闭了这个页面,session还在,他就不能再次打开这个页面了。[/quote] 重新打开时踢掉之前的session就行,这样最简单。 要么页面关闭时用onunload清掉服务端session,但是还不够,你要考虑异常关闭以及断网的情况。 再或者你做一个“心跳包”的东西,客服端每隔几秒向服务端发信息表示还在线。。。
liphee 2013-10-12
  • 打赏
  • 举报
回复
引用 19 楼 KK3K2005 的回复:
[quote=引用 楼主 liphee 的回复:] 如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。 描述可能比较绕,我举个例子。 做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。 如何实现,请具体指教。 PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了: 一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器; 二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。 重分悬赏,如果发错区,请版主移动,谢谢。
cookie 可以解决 假定 打开页面后 设置一个 在cookie中设置一个key 他的值是当前时间 每间隔 1秒 刷新时间 页面 开始 要判断 这个key是否存在 不存在 表示没有 打开页面 存在 则看 他的值的时间 和 当前时间 相差多少 相差很少 1秒的话 有理由认为 有一个页面已经打开了 那么跳转其他页面 否则 正常开始 感觉有点啰嗦 [/quote] 还是这个问题,如果相差少于一秒,是判断页面已经打开这是第二次打开。还是判断为刚刚关闭了页面又重新打开了这个页面?
KK3K2005 2013-10-12
  • 打赏
  • 举报
回复
引用 20 楼 liphee 的回复:
[quote=引用 19 楼 KK3K2005 的回复:] [quote=引用 楼主 liphee 的回复:] 如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。 描述可能比较绕,我举个例子。 做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。 如何实现,请具体指教。 PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了: 一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器; 二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。 重分悬赏,如果发错区,请版主移动,谢谢。
cookie 可以解决 假定 打开页面后 设置一个 在cookie中设置一个key 他的值是当前时间 每间隔 1秒 刷新时间 页面 开始 要判断 这个key是否存在 不存在 表示没有 打开页面 存在 则看 他的值的时间 和 当前时间 相差多少 相差很少 1秒的话 有理由认为 有一个页面已经打开了 那么跳转其他页面 否则 正常开始 感觉有点啰嗦 [/quote] 还是这个问题,如果相差少于一秒,是判断页面已经打开这是第二次打开。还是判断为刚刚关闭了页面又重新打开了这个页面?[/quote] 你页面 如果打开着 那么 那个cookie里面的数值 每秒换一次 所以你 间隔1秒检查 1次 就知道有没有其他人在动了 办法是很多的
KK3K2005 2013-10-11
  • 打赏
  • 举报
回复
引用 楼主 liphee 的回复:
如何实现这样的功能:一个访客,如果已经打开了这个网页,那么在新窗口中再打开这个网址就提示已经打开,或者直接跳到已经打开这个网址的窗口。 描述可能比较绕,我举个例子。 做在线聊天,一个人在浏览器中输入www.***.com/chat 那么浏览器正常打开这个页面。如果这个页面不关闭,他在新窗口再输入这个网址,就不能让他再打开了。提示已经打开过这个网页,或者直接切换到已经打开这个网址的窗口。 如何实现,请具体指教。 PS:我已经试过cookie了,用cookie记录这个网页是否被打开了,同时设置浏览器关闭cookie失效,但是有几个问题解决不了: 一是,如果用两个浏览器,是可以同时打开这个网页的。因为cookie不能跨浏览器; 二是,有时候浏览器异常关闭,那么这个cookie值就没有失效,下次就打不开这个网页了。 重分悬赏,如果发错区,请版主移动,谢谢。
cookie 可以解决 假定 打开页面后 设置一个 在cookie中设置一个key 他的值是当前时间 每间隔 1秒 刷新时间 页面 开始 要判断 这个key是否存在 不存在 表示没有 打开页面 存在 则看 他的值的时间 和 当前时间 相差多少 相差很少 1秒的话 有理由认为 有一个页面已经打开了 那么跳转其他页面 否则 正常开始 感觉有点啰嗦
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 17 楼 shendaowu 的回复:
http://www.google.com.hk/#newwindow=1&q=unique+identification+tab+browser&safe=strict 搜了一下,唯一标识tab好像是个很难的问题,基本上都说不能。 我16楼说的分配唯一标识指的是在页面打开之后发送一个AJAX,返回的那个值必须每次都是不同的,至少对于单个用户来说必须是每次都不同的。不过对于所有用户都不同可能更好处理一些,对服务器的压力可能也更小一些。
给我个启发,用用户Id和时间来标识他打开过的窗口。如果他他一前一后发来两个标识,我不知道是他打开了第二个窗口还是他关掉之前的那个又重新打开了一个?
申祷无 2013-10-11
  • 打赏
  • 举报
回复
http://www.google.com.hk/#newwindow=1&q=unique+identification+tab+browser&safe=strict 搜了一下,唯一标识tab好像是个很难的问题,基本上都说不能。 我16楼说的分配唯一标识指的是在页面打开之后发送一个AJAX,返回的那个值必须每次都是不同的,至少对于单个用户来说必须是每次都不同的。不过对于所有用户都不同可能更好处理一些,对服务器的压力可能也更小一些。
申祷无 2013-10-11
  • 打赏
  • 举报
回复
引用 15 楼 shendaowu 的回复:
通过页面打开的时间和用户的ID标识一个特定的页面,通过js获取页面打开的时间,在更新消息的同时发送这个打开页面的时间。这样的话如果再打开一个页面的话,就会发送不同的打开页面时间,这样就能区别不同的页面了。如果服务器同时受到两个带有不同页面打开时间的消息更新请求,那么只响应那个页面打开时间较早的。但是在打开页面之前可能需要等待1个消息刷新周期那么长的时间,不知道怎么避免这个,毕竟这会影响用户体验的,但是是否会出现这个问题我不太确定。 可能有点想当然了,不知道有没有漏洞。
在页面打开的时候为页面分配一个唯一标识也许能避免页面打开时间重复的问题。如果用户不是手动操作的话可能会出现打开时间一样的情况。
申祷无 2013-10-11
  • 打赏
  • 举报
回复
通过页面打开的时间和用户的ID标识一个特定的页面,通过js获取页面打开的时间,在更新消息的同时发送这个打开页面的时间。这样的话如果再打开一个页面的话,就会发送不同的打开页面时间,这样就能区别不同的页面了。如果服务器同时受到两个带有不同页面打开时间的消息更新请求,那么只响应那个页面打开时间较早的。但是在打开页面之前可能需要等待1个消息刷新周期那么长的时间,不知道怎么避免这个,毕竟这会影响用户体验的,但是是否会出现这个问题我不太确定。 可能有点想当然了,不知道有没有漏洞。
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 13 楼 dragonballlike 的回复:
[quote=引用 12 楼 liphee 的回复:] [quote=引用 11 楼 dragonballlike 的回复:] 1.服务器端设置用户在线状态(用户名+ip+session) ,可以用唯一cookie记录当前页面.在其他页面或者其他浏览器页面打开,根据用户在线状态进行提示(但没法直接切换到指定窗口)。 2.浏览器端定时与服务器端“交流”,服务器端在期望时间内没有收到浏览器端信息则认为用户已下线,初始化各种状态(用户可以再次进入)
你这个方法不可行,BS模式只能客户端想服务器发送请求,如果客户端关闭,那么服务器端就不能为这个客户端执行程序,那么用户的状态就无法初始化[/quote] 初始化状态是在服务器端,只要服务器端是初始化的,就可以了。客户端不参与初始化。[/quote] 服务器端的程序是需要客户端激活的呀,难道要写定时程序?
dragonballlike 2013-10-11
  • 打赏
  • 举报
回复
引用 12 楼 liphee 的回复:
[quote=引用 11 楼 dragonballlike 的回复:] 1.服务器端设置用户在线状态(用户名+ip+session) ,可以用唯一cookie记录当前页面.在其他页面或者其他浏览器页面打开,根据用户在线状态进行提示(但没法直接切换到指定窗口)。 2.浏览器端定时与服务器端“交流”,服务器端在期望时间内没有收到浏览器端信息则认为用户已下线,初始化各种状态(用户可以再次进入)
你这个方法不可行,BS模式只能客户端想服务器发送请求,如果客户端关闭,那么服务器端就不能为这个客户端执行程序,那么用户的状态就无法初始化[/quote] 初始化状态是在服务器端,只要服务器端是初始化的,就可以了。客户端不参与初始化。
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 11 楼 dragonballlike 的回复:
1.服务器端设置用户在线状态(用户名+ip+session) ,可以用唯一cookie记录当前页面.在其他页面或者其他浏览器页面打开,根据用户在线状态进行提示(但没法直接切换到指定窗口)。 2.浏览器端定时与服务器端“交流”,服务器端在期望时间内没有收到浏览器端信息则认为用户已下线,初始化各种状态(用户可以再次进入)
你这个方法不可行,BS模式只能客户端想服务器发送请求,如果客户端关闭,那么服务器端就不能为这个客户端执行程序,那么用户的状态就无法初始化
dragonballlike 2013-10-11
  • 打赏
  • 举报
回复
1.服务器端设置用户在线状态(用户名+ip+session) ,可以用唯一cookie记录当前页面.在其他页面或者其他浏览器页面打开,根据用户在线状态进行提示(但没法直接切换到指定窗口)。 2.浏览器端定时与服务器端“交流”,服务器端在期望时间内没有收到浏览器端信息则认为用户已下线,初始化各种状态(用户可以再次进入)
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 9 楼 dancewind 的回复:
想实现这种功能用session、cookie这种方式肯定是不行的,cookie解决不了跨浏览器的问题,session解决不了客户端关闭的问题,必须得用flash或者websocket这种能保持长链接的技术在服务器记录当前机器已经打开这个地址了,这样才能保证
能详细说明下吗?
dancewind 2013-10-11
  • 打赏
  • 举报
回复
想实现这种功能用session、cookie这种方式肯定是不行的,cookie解决不了跨浏览器的问题,session解决不了客户端关闭的问题,必须得用flash或者websocket这种能保持长链接的技术在服务器记录当前机器已经打开这个地址了,这样才能保证
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 4 楼 goinni 的回复:
如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记
那如果用户打开这个页面,我记录了session,用户又关闭了这个页面,session还在,他就不能再次打开这个页面了。
liphee 2013-10-11
  • 打赏
  • 举报
回复
引用 1 楼 blackant2 的回复:
1.在服务端处理.同一用户名登录后.无法再次登陆. 2.超时清除
请问有具体操作方法吗
notlikeGaoShou 2013-10-11
  • 打赏
  • 举报
回复
引用 4 楼 goinni 的回复:
如果 不用cookie的话,那只能在服务段做处理,可以根据IP地址做唯一标识或用户等,在session过期时清除标记
我一般会这么做
萧萧可乐 2013-10-11
  • 打赏
  • 举报
回复
cookie配合上服务器端 如果做的是局域网内的 应用的话 还是有实现的可能。。。 其它情况的话。。。 建议放弃吧。。
加载更多回复(4)

87,995

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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