php - 防止重复的窗口/选项卡

标签 php mysql architecture email-verification

我已为我的网站设置了电子邮件验证。

用户注册后,系统会提示他们通过通过电子邮件发送给他们的链接验证其帐户。如果用户单击该链接,则会激活他们的帐户并将他们带到登录屏幕,当然是在新选项卡中。

也许我是强制症,但我的问题是,如果有人在注册后立即验证其帐户而不关闭第一个选项卡,则在单击验证链接后,他们将在登录屏幕上打开两个选项卡。 如果已打开具有相同域的选项卡,是否有任何方法可以防止这种情况或使用相同的选项卡?或者有更好的架构可以使用吗?

我已经设置了验证过程,以便我的数据库中有两个单独的表。

users_unverified(表 A)

account_email |账户密码 |代币|进入时间 | num_id(主要)

users_verified(表 B)

account_email |账户密码 |加入| ...

这个过程可以这样分解:

  1. 用户使用电子邮件和密码注册,这会创建 token
  2. token 会通过电子邮件发送给他们,并附有验证链接
  3. 用户通过链接注册后(如果 token 匹配且未过期),account_emailaccount_password 将从 users_unverified 转移到users_verified 并显示确认消息
  4. users_unverified 中的记录已删除

是否有不同的或更好的方法来执行此操作,这将使我避免同时打开两个选项卡的可能性?

最佳答案

一般来说,我认为您不需要担心这一点,用户会理解单击电子邮件中的链接将打开浏览器选项卡,然后完成该过程。

不过,如果您确实想要这样做,您可以使用 localStorage 设置窗口已打开的状态,并使用 BroadcastChannel 在选项卡之间发送数据(例如例如,将哈希值发送回您的窗口,以便您可以显示要求验证电子邮件或执行重定向的 DOM)

这是一个例子:

此 JavaScript 将位于注册页面上:

<script type="text/javascript">
    var channel = new BroadcastChannel("linkopened");
    channel.onmessage = function(e) {
        // do something with data sent from other tab
        alert('Email link opened, show DOM or redirect: ' + e.data)
    };

    localStorage.setItem('pageopen', true);
    window.onbeforeunload = function() {
        localStorage.removeItem('pageopen');
    };
</script>

这将位于在新选项卡中打开的页面上:

<script type="text/javascript">
    if (localStorage.getItem('pageopen')) {
        var channel = new BroadcastChannel("linkopened");
        channel.postMessage('Some special link or hash');
        window.close();
    }
</script>

关于php - 防止重复的窗口/选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49418182/

相关文章:

php - 更新记录时出错

mysql - 连接表时如何使用案例条件

c# - 如何减少来自 .NET Windows 应用程序的数据库 (SQL Server) 调用

c# - 随着软件复杂性的增加组织事件处理的方法

php - 在 PHP 中将整数转换为十六进制值

php - 引用 - 这个错误在 PHP 中意味着什么?

javascript - 将 JQuery Ajax 函数中的数组数据检索到 JavaScript 中

php - Kohana 持久 session 和子域

php - MySQL基于同一张表更新表

django - 在 django 中放置一个中间件的成本是多少