Javascript 处理数据表中的会话超时(使用服务器端数据源处理)

Javascript 处理数据表中的会话超时(使用服务器端数据源处理),javascript,jquery,struts,datatables,struts-1,Javascript,Jquery,Struts,Datatables,Struts 1,我有一个由服务器端Ajax数据源支持的datatables表单(它在后端使用struts操作来处理请求、获取数据和发送JSON响应)。 服务器端操作需要在身份验证模式下运行,即需要有一个活动会话 处理数据表中会话超时错误的最佳方法是什么?目前,它只是显示一个JSON格式错误,这不是用户的最佳选择。出于明显的原因(兼容性、未来的可维护性等),我不想去更改datatables代码。有没有处理错误的好方法 我一直在考虑在JSON响应中嵌入错误消息,但在前端流中拦截错误消息的最佳位置在哪里 编辑:我认为

我有一个由服务器端Ajax数据源支持的datatables表单(它在后端使用struts操作来处理请求、获取数据和发送JSON响应)。 服务器端操作需要在身份验证模式下运行,即需要有一个活动会话

处理数据表中会话超时错误的最佳方法是什么?目前,它只是显示一个JSON格式错误,这不是用户的最佳选择。出于明显的原因(兼容性、未来的可维护性等),我不想去更改datatables代码。有没有处理错误的好方法

我一直在考虑在JSON响应中嵌入错误消息,但在前端流中拦截错误消息的最佳位置在哪里


编辑:我认为进行此类后处理的最佳位置应该是fnServerData,对吗?

我会返回一个包含某种错误代码的JSON响应。要处理它,您需要按照您的推测定义fnServerData。但是,在使用错误回调之前,我会强烈地考虑用例:

错误只是获取资源时出现的任何问题,并使用状态代码。假设会话在服务器上终止。用户请求数据时,服务器返回500错误。错误回调说,“好吧,太糟糕了。让我们重定向到登录页面。”一切都很好

然而。。。用户发出请求。无论出于何种原因(大数据集、网络条件),请求都需要一点时间。同时,用户决定导航到另一个页面,从而中断呼叫-响应循环。如果没有响应,错误回调将被触发,用户将被重定向到登录页面(或错误回调中设置的任何函数)

问题是,我不知道“会话已过期”的状态代码(尽管我很想知道!我不介意这里出错!),以便捕获和处理

我不是说你“不应该”或“不能”使用错误回调。但是该函数必须考虑除会话过期以外的错误。您可能需要根据状态代码进行不同的处理。如果您的函数能够优雅地处理所有这些情况,那就太好了!在一个应用程序中,我们确实重定向到登录页面,错误回调常常会由于误报而中断,从而将用户错误地转储到登录页面。对于“会话已过期”的情况,我们通过JSON消息在成功回调中捕获它


[在Dave的精彩评论后更新:]如果您的服务器返回了一个有用的服务器错误(401、403、550或在您的场景中有意义的任何错误),那么在.ajax()调用中使用带有statusCode参数的fnServerData(这是一个很好的例子!)也会起作用。我认为这是同样的工作量:通过您已经编写的方法返回JSON,或者通过您应该已经有权访问的方法返回状态错误。选择对你有意义的答案。

我已经用比尔·马蒂诺的答案完成了:

在Ajax源响应上,您应该返回如下Json字符串:

{"error": "expired"}

下面的技术对我有用。。。我知道现在回复已经太晚了,但希望代码能帮助别人

1) 检查控制器(MVC)中的会话是否超时,并返回 应在客户端处理的状态代码

if (!Request.IsAuthenticated)
{
    return new HttpStatusCodeResult((HttpStatusCode)302, "Authentication timeout");
}
2) 在客户端,使用jqueryglobalajaxerror,它捕获所有ajax调用中的错误。检查状态代码并重定向到您的登录页面

$(document).ajaxError(function (event, jqxhr, settings, thrownError) {
   if (jqxhr.status === 302) {
      document.location.href = '/account/login';
   }
});
3) [可选]禁用数据表中的警告,并在控制台中检查错误

/*disable datatable warnings*/
$.fn.dataTable.ext.errMode = 'none';

/*display warnings in the console*/
$tblDashboard.on('error.dt', function (e, settings, techNote, message) {
      console.log('An error has been reported by DataTables: ', message);
});

1.在获取ajax错误页面中使用此代码。或者也使用了页脚文件。此代码在重定向到登录页面未获得ajax错误后在会话超时时工作

$(document).ajaxError(function(event, jqxhr, settings, exception) {

if (exception == 'Unauthorized') {
    // Prompt user if they'd like to be redirected to the login page
    window.location = '<?=route("admin.login")?>';

    }
});
function CheckSession() {
    var session = '<%=Session["name"] != null%>';
    //session = '<%=Session["username"]%>';
    if (session == false) {
        window.location = '<?=route("admin.login")?>';
    }
}

setInterval(CheckSession(),500);
举个例子

function ChangeUrl(){
        $.fn.dataTable.ext.errMode = 'none';
        product_table.fnStandingRedraw();
    }

尽管这个问题已经问了很长时间了,但如果有人需要的话,我会发布我的解决方案

此解决方案适用于JQuery Datatables的1.10.16版

经过一段时间的挖掘,我找到了在会话到期时显示警报的函数。这是:

/**
     * Log an error message
     *  @param {object} settings dataTables settings object
     *  @param {int} level log error messages, or display them to the user
     *  @param {string} msg error message
     *  @param {int} tn Technical note id to get more information about the error.
     *  @memberof DataTable#oApi
     */
    function _fnLog( settings, level, msg, tn )
    {
        msg = 'DataTables warning: '+
            (settings ? 'table id='+settings.sTableId+' - ' : '')+msg;

        if ( tn ) {
            msg += '. For more information about this error, please see '+
            'http://datatables.net/tn/'+tn;
        }

        if ( ! level  ) {
            // Backwards compatibility pre 1.10
            var ext = DataTable.ext;
            var type = ext.sErrMode || ext.errMode;

            if ( settings ) {
                _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
            }

            if ( type == 'alert' ) {
                alert( msg );
            }
            else if ( type == 'throw' ) {
                throw new Error(msg);
            }
            else if ( typeof type == 'function' ) {
                type( settings, tn, msg );
            }
        }
        else if ( window.console && console.log ) {
            console.log( msg );
        }
    }
正如您所看到的,在类型变量上有一个检查,看看它是否是一个函数。如果是,它将被调用。请注意,类型变量的获取方式如下:

var type = ext.sErrMode || ext.errMode;
所以我这样做了:

//Check the message and redirect
  $.fn.dataTable.ext.errMode = function (settings, tn, msg) {
    if (msg.indexOf("YourErrorCode") != -1) {
      window.location = "/login";
    }
  }
只要用你需要的代码替换你的错误代码,它就会工作。
我承认这不是有史以来最干净的代码,但它确实有效。

没错;只需定义一个
错误
回调。刚刚在.ajax中发现了statusCode参数,这可能有助于解决这方面的问题。我仍然会对过期会话使用成功处理程序,对其他问题使用状态码或错误处理程序。如果用户离开页面,Ajax请求将消失,并且不会触发回调,不是吗?服务器是否发回成功或错误的HTTP代码取决于首选项和域。IMO要求需要会话但没有会话的请求应该返回一个“禁止”代码,因为这是事实。你会想。我不知道什么魔术涉及,但回调确实火灾,如果你导航在中间的请求。不过,禁码是个好主意。使用statusCode参数处理它也很容易。如果您的应用程序不需要区分会话到期和其他禁止状态,我倾向于将其作为更好的解决方案。我的错误是,我使用BEFORE卸载之前按照,并且很长时间没有真正考虑它;现在我觉得自己很傻:)谢谢gentlmen,这正是我最终要做的:当会话在服务器端超时时返回一个格式良好的JSON,其中包含一条错误消息,在客户端的fnServeData上解析它
var type = ext.sErrMode || ext.errMode;
//Check the message and redirect
  $.fn.dataTable.ext.errMode = function (settings, tn, msg) {
    if (msg.indexOf("YourErrorCode") != -1) {
      window.location = "/login";
    }
  }