我已为我的网站设置了电子邮件验证。
用户注册后,系统会提示他们通过通过电子邮件发送给他们的链接验证其帐户。如果用户单击该链接,则会激活他们的帐户并将他们带到登录屏幕,当然是在新选项卡中。
也许我是强制症,但我的问题是,如果有人在注册后立即验证其帐户而不关闭第一个选项卡,则在单击验证链接后,他们将在登录屏幕上打开两个选项卡。 如果已打开具有相同域的选项卡,是否有任何方法可以防止这种情况或使用相同的选项卡?或者有更好的架构可以使用吗?
我已经设置了验证过程,以便我的数据库中有两个单独的表。
users_unverified
(表 A)
account_email |账户密码 |代币|进入时间 | num_id(主要)
users_verified
(表 B)
account_email |账户密码 |加入| ...
这个过程可以这样分解:
- 用户使用电子邮件和密码注册,这会创建 token
- token 会通过电子邮件发送给他们,并附有验证链接
- 用户通过链接注册后(如果 token 匹配且未过期),
account_email
和account_password
将从users_unverified
转移到users_verified
并显示确认消息 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/