这个网站如何知道我正在打开另一个标签页?

15

当我登录到我的大学的“学习系统”时,发现无法用相同网站在新的标签页中打开。这时,该网站会显示以下信息:

Session already running?

这网站是如何知道我在电脑上打开了哪些选项卡?据我所知,前端代码不应该能访问我的私人浏览器信息。这个网站可能使用哪些可访问的信息来确定我是否已经打开另一个选项卡呢?

我正在使用私人电脑访问该网站,并且被访问的网站不在本地网络中,是通过互联网访问的。因此,没有内部监控软件可能导致这种情况。我正在使用 Google Chrome 24 Beta for Mac。


2
你如何打开一个新标签页?很有可能他们正在检查引荐来源,当它发现你没有引荐来源或者你从一个页面跳转到另一个不在“序列”中的页面时,就会弹出一个错误。它还可以使用一个会话变量/IP组合来跟踪你正在浏览的页面。 - Brad Christie
你是在打开新标签页时立即看到这条消息,还是在执行新标签页中的某些操作后才看到它?如果通过“在新标签页中打开链接”选项打开标签页,您是否会看到它? - Martin Smith
我一打开新标签页就能看到它。 - element119
3个回答

5
一种方法是通过cookie和id实现。首先,您登录网站并在其中拥有一个会话。这是使用cookie进行管理的;每当您访问站点上的页面时,您的浏览器将发送一个包含某种id的cookie。这样服务器就可以确定来自您的任何请求都真正来自于您。因此,在这种情况下,您原始的选项卡和新选项卡都将发送相同的cookie。
其次,它还可以向您在站点上提交的任何链接或表单添加另一个不同的id(称之为页面id)。因此,页面上的一个表格可能包含id 1234,并且任何链接也将包含该id。您访问的每个新页面可能包含一个新的id。因此,在任何时候,站点都知道您的下一个请求(由cookie标识)也应包含此其他id。如果以常规方式浏览站点,单击链接,提交表单,这将成立,一切都会很好。
您的下一个请求不会提交预期的第二个id的情况包括:
1.您按了返回按钮(您将发送旧页面id) 2.您打开了一个新选项卡(这取决于浏览器,但如果它在原始选项卡中打开您已经访问的页面,则会发送当前页面id,而不是服务器预期的下一个页面id)
无论哪种方式,您都会发送一个页面id,服务器不希望的请求,并且可以猜测您所做的最佳猜测。

1
据我所知 - Chrome在选项卡之间共享会话/cookie。 - matt freake

0

网站知道你打开了另一个标签页的另一种方式是通过广播通道。简单来说,广播通道是窗口、标签页等之间进行通信的一种手段(如果我理解有误请指正)。以下是一个简单的实现:

//Channel to post and receive messages from
const bc = new BroadcastChannel("Check-tabs");

//On message receive
bc.onmessage = (event) => {
  if (event.data === `First tab?`) {

    //Post that there is already a tab open
    bc.postMessage(`Tab already open`);
  }

  //Check if a tab is open
  if (event.data === `Tab already open`) {
    alert(`Another tab is already open.`);
  }

//Posts message to check whether another tab is open
bc.postMessage(`First tab?`);

0
他们在您访问他们的网站时跟踪您的鼠标光标移动。这是引起访客注意的好方法。当您移动鼠标或想要关闭页面时,他们会自动地发出一些查询。
这是良好的用户体验。

3
欢迎来到SO!我知道你提到的技术,但首先我不确定这是否是良好的用户体验——我最大的烦恼之一就是当我把鼠标移出窗口时,会出现一个巨大的订阅提供或“等等”,试图引诱我留在网站上。虽然这与本帖并不相关,更关键的是,该网站如何检测使用键盘快捷方式打开的选项卡? - ggorlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接