如何通过JavaScript知道某人是否已登录?

4

在PHP中,我会这样做:

if (isset($_COOKIE['user']) && $_COOKIE['user'] == $valueFromDb)
 echo 'logged';

但在 JavaScript 中,我该如何检查它呢?谢谢。
4个回答

8

如果会话在服务器端过期,没有可靠的方法可以在不向服务器发出请求的情况下完成此操作。在一个项目中,我采用了以下不完美的方式:

checkAuth() {
    var logged = (function() {
        var isLogged = null;
        $.ajax({
            'async': false,
            'global': false,
            'url': '/user/isLogged/',
            'success': function(resp) {
                isLogged = (resp === "1");
            }
        });
        return isLogged;
    })();
    return logged;
}

我说它不完美是因为它会发起同步请求,这会暂时锁住浏览器。它的优点在于checkAuth()可以可靠地从客户端应用程序的任何部分调用,因为它强制浏览器在继续执行JS代码之前等待结果,但仅此而已。

另一种选择是异步(非锁定)方法,可以像这样实现:

$.ajax({
    'url': '/user/isLogged/',
    'success': function(resp) {
        if(resp === "1") {
            // do your thing here, no need
            // for async: false  
        }
    }
});

你能稍微解释一下吗? - dynamic
第一个示例向/user/isLogged/发出请求,该请求仅检查用户是否已登录(通过$_SESSION),并发送“1”或“0”。 async:false选项强制浏览器等待请求完成-因此函数将始终返回布尔结果。 第二个示例意味着需要在success回调中完成任何需要发生的事情,这需要不同的架构,但消除了同步请求的需要。请参见http://api.jquery.com/jQuery.ajax/。 - karim79
如果我将第一个示例放入$.ready中,那么为什么要使用第二个示例呢? - dynamic
后端方面它是如何工作的?如何在php中返回true或false,以便JQ能够读取它?对于这个极度新手的问题,我感到抱歉... - Hexodus

1
当您想知道用户是否已登录页面以执行某种特殊操作时,我通常使用一个带有特殊名称的隐藏输入框,并在js中进行检查。如果用户已登录,则将其放置在主页面或类似位置,然后在js中检查其是否存在以了解用户是否已登录。
类似于以下内容:
<input type="hidden" class="UserIsLogged" />
<script type="text/javascript">
        if ($(".UserIsLogged").length > 0) {
            //User is logged
        }
</script>

0
你把服务器端处理(php)和客户端处理(javascript)混淆了。在客户端,除非服务器以某种特定于框架的方式提供了信息,否则这些信息是不存在的。

2
我没有混淆。我知道它们是分开的,所以我当然会问这个问题。 - dynamic
嗯,就字面意思而言,这个问题似乎将它们视为相同的,并且没有足够详细地解释你正在做什么,以便看到其他内容。 - bmargulies

0

您可以查看以下链接:https://dev59.com/6HRB5IYBdhLWcg3w1Kn0 - Mohammed Swillam
1
请记住,这不适用于 HttpOnly cookie(建议用于身份验证/会话数据)。 - Marcel Jackwerth

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