2009-12-07 53 views
0

想知道是否有人能帮助..检查用户登录使用jQuery

我加入了一些jQuery来我的网站,但我想限制一些动作取决于用户是否正在或没有登录。我不确定如何用Jquery检测会话变量。我最初的想法是使用Jquery Ajax调用我的checkUser cfc,然后检查从此返回的行数,并从那里开始工作。但我不确定如何解决这个问题。目前,我的代码看起来像这样

$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    var isLoggedIn = data.ROWCOUNT; 
}) 

if (loggedIn > 0) { 
    // Do this 
} 
else { 
    alert('You are not logged in'); 
} 
} 

但是,我收到一条错误消息,指出isLoggedIn变量未定义。想知道如何处理这个问题。

谢谢

回答

1

isLoggedIn变量是你在什么地方使用它的范围,它仅在的getJSON回调的,可以考虑在那里工作:

$.getJSON('...', {}, function(data){ 
    var isLoggedIn = data.ROWCOUNT > 0; // isLoggedIn is now boolean 

    if (isLoggedIn) { 
    // Do something 
    } else { 
    alert('You are not logged in'); 
    } 
}); 

我也建议你从服务器返回一个布尔值,而不是暴露行数

关于功能范围更多信息:

+0

啊,有同样的想法设置'isLoggedIn'为布尔值...我保证我没有看到您的代码第一个:) – 2009-12-07 22:40:01

+0

非常感谢您的回应 – namtax 2009-12-07 23:00:35

1

您正在回调中定义变量,但在该范围之外使用它。您需要将执行操作的代码移动到回调中。

$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    if (data.ROWCOUNT > 0) { 
     // do this 
    } 
    else { 
     alert('You are not logged in'); 
    } 
}); 

通常,我要做的是启用或禁用操作服务器端 - 即不传递代码以处理不可用的操作。带有调试器的人可能总是击败您的客户端检查,因此您需要非常小心,这取决于服务器调用的结果以强制执行安全性并始终检查服务器。

+0

我也有服务器端的安全性......谢谢 – namtax 2009-12-07 22:58:58

+0

或者定义那个变量超出函数范围 – bdukes 2009-12-07 22:59:02

+0

@bdukes - ajax调用是异步的,所以在函数之外定义它将解决未定义的引用,但它会不要以你想要的方式工作。您实际上需要在ajax调用返回后运行代码,并且要在回调中运行代码。 – tvanfosson 2009-12-07 23:28:55

0

有几个问题:

  1. 您定义isLoggedIn但引用loggedIn
  2. 你定义isLoggedIn一个函数里面,但引用它的功能外

您可以使用此解决:

var loggedIn = null; 
$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    loggedIn = (data.ROWCOUNT > 0); 
}); 

所以,你可以在其他地方测试在你的代码是这样的:

if(loggedIn){ 
    // Do something 
} else if (loggedIn === false) { 
    alert('You are not logged in'); 
} else { 
    // Callback hasn't been run yet 
} 

如果您只需要运行一次,只需将整个if语句(减去else)放入您的callb从$.getJSON方法确认。

0

代码有两个问题。

您注意到的第一个问题是,该变量只存在于您为处理回调而创建的匿名函数的范围内。

另一个问题是使用变量的代码在变量设置之前执行。

发送到服务器的请求,然后回调函数等待响应,但发送请求的代码不会等待响应,因此它将继续使用该变量的代码。

通过将使用该变量的代码移动到回调函数中解决这两个问题。

或者,将使用一个单独的函数变量的代码,并调用它从回调函数:

$.getJSON(
    'http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', 
    {}, 
    function(data) { 
    handleCallBack(data.ROWCOUNT > 0); 
    } 
); 


function handleCallBack(isLoggedIn) { 
    if (isLoggedIn) { 
    // Do this 
    } else { 
    alert('You are not logged in'); 
    } 
} 
1

既然你已经有几个很好的答案,让我扔一个公平的警告成讨论:

1)在将页面发送给客户端之前,操作用户看到的内容会更有意义,从而消除了您的方法中的很多复杂性。

2)不要依赖客户端脚本作为保护未登录用户的功能的唯一方法。可以通过简单地关闭脚本或编辑内容来绕过这样的客户端安全代码该页面将注释掉安全检查。

3)如果你绝对必须这样做,让服务器重新检查证书/登录状态开始动作时,即使客户端代码已经做了..

4)冗余校验我在第3项建议的另一个很好的理由就是用服务器端脚本而不是客户端JS/JQUERY来做到这一点。

+0

解释,我有一个链接用于投票,与JavaScript关闭此链接是由服务器端代码保护。你不能投票,除非你登录。随着JS打开,Jquery附加一个函数的投票链接,允许ajax投票,但允许那些未登录投票..我如何使这更安全?谢谢 – namtax 2009-12-08 09:36:15

+0

一些建议1)改为使用JQuery打开投票链接,当您在服务器上生成页面时将该函数添加到链接中,并根据需要激活或停用链接并将其发送。 2)当投票提交给服务器时,让服务器重新检查是否允许用户投票,即使通过客户端代码,您也不会期望他们有活动链接。 – JohnFx 2009-12-08 18:36:48

+0

很酷,谢谢你的建议 – namtax 2009-12-08 19:27:37