如何从Javascript中检查用户是否匿名或已登录?

10
我想确定用户是否已经登录或者只是匿名访问,需要使用javascript实现...我找到了这个问题,但是它是php代码,我不确定是否有一个叫做logged_in的session变量在登录时被存储,或者那个人只是自己实现的。请问有人知道如何使用ajax从javascript检查用户是否已经登录吗? 编辑:我正在运行Asp.Net MVC,抱歉没有说明。
这样我就可以实现客户端ajax登录。当页面加载时,我需要知道用户是否已经登录,以便使用jquery实现类似于<asp:LoggedInView>控件的功能。
谢谢, Matt

你的页面是ASP、PHP等哪种语言编写的? - VinPepe
我根据您的修改编辑了我的回复。 - kentaromiura
7个回答

11

无法从JavaScript读取保存的会话数据。

一种简单的方法是从PHP创建一个JS变量(比使用cookie更容易),像这样:

if ($_SESSION['logged_in'] == 1) {
    echo '<script type="text/javascript">var logged_in=true;</script>';
} else {
    echo '<script type="text/javascript">var logged_in=false;</script>';
}

然后JS将简单地检查原生的logged_in变量,以查看用户是否已登录。

<script type="text/javascript">
    if (logged_in) {
        alert("My user is logged in!");
    }
</script>

2
如果我们要谈论糟糕的实践(参考我答案上的所有评论),那么这种方法也有同样的缺陷。它仍然是一个客户端变量,很容易修改。然而,就回答原贴作者的问题而言,这个方法同样可行。 - idrumgood
6
绝对不安全。最好的方法是:在需要时使用HTTP AJAX请求检查服务器端(可能在您的JavaScript函数中)。 - Julien
一个非常适合初学者的好答案!确实如此。 - Java Nerd

7
[免责声明] 由于我收到很多人评论说这是'不好的做法',我只想说:确实以这种方式做事是不好的,但我们不知道原帖作者的意图。我们只知道,他已经做了其他一切100%正确和安全的事情,只是想知道是否有一种从javascript访问的方法。在下面的内容中,我提供了最佳方法来完成他所要求的任务。[/免责声明]
您可以使用php或其他后端语言设置一个cookie,然后用javascript读取它。
document.cookie

简单来说,您需要搜索cookie字符串以查找已登录cookie的名称。您还可以使用它来设置一个cookie,并通过javascript进行登录(尽管这可能不是最好的选择)。在这里可以快速了解javascript cookie访问的概述。
编辑:
针对客户端脚本具有会话信息访问权限及原始问题中提到的ajax的问题:
是的,ajax调用是检查这个非常简单的方法。我更喜欢jQuery,所以我的ajax经验就在那里,但基本上,您将对后端函数执行ajax调用,该后端函数只检查“登录”会话变量,返回true或false。
此外,由于您现在提到正在使用jQuery,请参见此页面以轻松访问jQuery cookie。

我不会点踩因为从技术上讲它是正确的,但我应该提醒一下,这可能是错误的!客户端脚本不应该知道任何关于会话的信息,它必须在服务器端透明地处理。 - kentaromiura
3
你说得没错,客户端脚本不应该知道会话相关的东西,但原帖的问题是如何从 JavaScript 中访问这些信息,提供的答案解决了这个问题。 - idrumgood
好的,但如果您使用无cookie身份验证,则仍然是错误的。唯一的方法是查看URL是否有内容。如果有人使用自定义身份验证模式(例如在隐藏字段中传递sessionID),那么这种方式也不是一个好的处理方式。正确的做法是加载2个不同的脚本,一个用于匿名访问,另一个用于已认证的用户。顺便说一下,如果脚本显示/隐藏重要内容以明显的安全原因(以及性能原因),那么该部分应由服务器端生成。 - kentaromiura
肯特,原问题并不是在询问检查用户登录时是否应该使用JavaScript,也没有问如何处理安全性或任何其他相关内容。也许他有一个非常好的理由想要从JavaScript中访问这些信息。我只是回答了他所提出的问题。 - idrumgood
为什么 Sys.Services.AuthenticationService 有一个 get_loggedin() 方法来检查用户是否从 Javascript 登录?那个方法是如何工作的? - Matt
显示剩余3条评论

2
这通常是使用服务器端语言实现的解决方案。使用JS,您至少可以在其客户端中设置一个cookie来存储该信息。
然而,使用Ajax,您应该有一个页面(例如check_login.jsp/.apsx等),用于检查用户是否已登录(访问DB、Session变量等),如果是,则通过JSON将该信息返回给JS,并且例如点亮一个带有绿色的DIV...
所以: check_login.aspx--> 通过Response.Write("{user_logged:true}");返回信息
login.aspx在您的HTML代码中使用JS进行AJAX调用,其中您的xmlhttp已经是XMLHttpRequest对象的实例...
var logged = JSON.parse(xmlhttp.responseText); // don't use eval
if(logged.user_logged)
document.getElementById("u_l").style.backgroundColor = "#00FF00";

1

我认为最好的方法是通过ajax来实现。

这样做就可以了。

JS文件...

        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: 'check.php',
            success: function(d) { 
                if(d.r == "fail") {
                    window.location.href = d.url;
                } else {
                    console.log(d.msg);
                }
            }
        });

check.php

    if(!isset($_SESSION['loggedin'])){

        $response = array(
            'r' => 'fail',
            'url' => '/home.php'
        );
    } else {

        $response = array(
            'r' => 'success',
            'msg' => 'Logged in'
        );
    }

    echo json_encode($response);
    exit;

1

这没有任何意义。 如果用户已登录,则服务器端会知道。 因此,您无需在客户端检查是否已登录。

--编辑:

在您的澄清之后,我只能建议在控制器上验证用户是否已登录,如果是,则显示正常视图,否则将显示不同的视图。

--编辑添加格言:

有些人遇到问题时会想:“我知道,我会使用ajax。”现在他们至少有两个问题了。


0
你可以使用以下代码进行检查:
if(jQuery('body').hasClass('logged-in')) {
 // add your jquery code
 }

0

你可以解析 document.cookie。


1
无法使用HttpOnly cookie,即使没有使用它们也是错误的,因为任何人都可以开始会话,但这并不意味着他们已经登录...最后,JS不应该读取服务器端用于cookie。 - Ja͢ck

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