1

我有几个需要用户登录的网页。这些页面经常使用 jQuery 进行 Ajax 调用。当进行 Ajax 调用时,服务器能够(通过会话 cookie)识别用户是否登录。这都是非常标准/基本的东西。

我的问题是有时会话变得无效,即使页面仍在浏览器中。例如,用户登录到站点,做一些工作 - 然后离开几个小时。返回后,用户的浏览器仍在页面上,用户尝试进行 Ajax 调用。此 Ajax 调用现在失败,因为用户的会话已超时。另一个例子是多个设备。用户在他/她的办公桌前浏览并打开浏览器,然后用户出于任何原因使用另一台机器或设备登录到该站点。第二个设备使第一个会话无效(在这个特定公司,每个用户 ID 只允许一次登录)。返回到第一个框后,用户尝试了一个失败的 Ajax 操作。

请注意,我担心的不是安全问题——系统在这方面工作正常,确保用户在尝试进行 Ajax 调用时具有有效的会话。问题是当用户的会话超时时,它没有得到妥善处理。如果用户在其中一种情况下做了很多工作(比如填写了很长的表单),然后尝试使用 Ajax 保存表单,则保存将失败。用户唯一能做的就是在另一个选项卡中登录系统,然后返回失败的选项卡并重试。不是很优雅。

这一定是一个常见问题,但我不确定解决方案。理想情况下,我想要的是:如果由于用户没有有效会话而导致 Ajax 调用失败,则弹出一个允许用户登录的对话框,然后自动重试该操作。

我不知道,我的客户端代码中可能有 50 个 Ajax 调用。有什么办法可以在全球范围内做到这一点?如果有某种简单的 jQuery 解决方案,那就太好了。人们尝试了什么?

4

2 回答 2

1

您应该返回 401 HTTP 状态 - http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

然后你可以使用全局 ajax 事件处理程序.ajaxError()

$( document ).ajaxError(function( event, jqxhr, settings, exception ) {
    if ( jqxhr.status== 401 ) {
        $( "div.log" ).text( "Triggered ajaxError handler." );
    }
});
于 2013-08-03T01:27:42.477 回答
0

我已经接受了 denov 的回答。ajaxError 是我需要的技巧。这是我最终使用的解决方案:

$(document).ajaxError(function( event, jqxhr, settings, exception) {
    if (jqxhr.status== 401) {
        // Show the log on dialog
        $('<div id="divLogonDialog"></div>').data('ajaxSettings', settings).dialog({
            modal: true,
            open: function () { $(this).load('/dialogs/logonDialog.html'); },
            close: function(event, ui) { $(this).remove(); },
            minHeight: 400,
            width: 720,
            title: 'Logon'
        });
    }
}); 

通过使用 data 方法并将设置传递给登录对话框,如果登录成功,我将调用它:

$.ajax($('#divLogonDialog').data('ajaxSettings'));

重试ajax调用。

于 2013-08-30T17:48:11.683 回答