2011-10-05 208 views
2

我有一个由服务器端Ajax数据源支持的数据表格形式(它在后端使用struts动作来处理请求,获取数据并发送一个JSON响应)。 服务器端操作需要以认证模式运行,即需要有活动会话。在Datatables中处理会话超时(使用服务器端数据源处理)

在Datatables中处理会话超时错误的最佳方法是什么?目前它只显示JSON格式错误,这对用户来说不是最好的选择。我不想去显示数据表代码(兼容性,未来可维护性等)。有没有一种整洁的方式来处理错误?

我一直在思考如何在JSON响应中嵌入错误消息,但在前端流程中哪里是拦截它的最佳位置?

编辑:我认为做这种后期处理的最佳场所将在fnServerData中,我是否正确?

+2

这是正确的;只需定义一个'error'回调。 –

回答

2

我会触发一个包含某种错误代码的JSON响应。为了处理它,你需要定义你所猜测的fnServerData。不过,在使用错误回调之前,我会强烈考虑这个用例,因为这个原因:

错误是取回资源并使用状态码的任何问题。假设会话在服务器上终止。用户请求数据,服务器发回500错误。错误回调说:“好吧,那个吸引人,让我们重定向到一个登录页面。”一切都很好。

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

问题是没有我知道的状态代码(我很想知道,虽然!我不介意在这里错了!)'会话已过期'以捕获和处理。

我不是说你“不应该”或“不能”使用错误回调。但该功能必须考虑到会话过期以外的错误。您可能需要根据状态代码进行不同的处理。如果你的函数优雅地处理所有这些情况,太好了!在一个应用程序中,我们确实重定向到登录页面,并且错误回调经常会由于误报而跳机,并将用户错误地转储到登录页面。对于“会话过期”的情况,我们通过JSON消息在成功回调中捕获它。如果你有你的服务器返回一个有用的服务器错误(401,403,550或者你的场景中有意义的东西),那么在.ajax()调用中使用带有statusCode参数的fnServerData(这真是太棒了!)也同样适用。我认为这是相同的工作量:通过您已经编写的方法返回JSON,或者通过您应该有权访问的方法返回状态错误。选择哪一个对你有意义。

+0

刚发现.ajax中的statusCode参数,这可能有助于这方面的事情。我仍然会使用过期会话的成功处理程序,以及statusCode或其他问题的错误。 –

+2

如果用户离开页面,Ajax请求将消失,并且不会触发回调,否?服务器是否发回成功或错误的HTTP代码是一个偏好和域的问题。国际海事组织要求召开会议,但没有人应该返回一个“禁止”代码,因为这是事实。 –

+0

你会想。我不确定涉及到什么魔法,但如果您在请求中间离开,回调的确会触发。不过,禁止代码是一个好主意。使用statusCode参数处理它也很容易。如果您的应用程序不需要区分会话到期时间和其他禁止状态,我倾向于作为更好的解决方案。 –

0

我一直在使用比尔·马蒂诺在这里回答了这事 http://datatables.net/forums/discussion/4377/catch-text-returned-from-server-side-ajax-call

"fnServerData": function (sSource, aoData, fnCallback) { 
    // get filter ID 
    var filter_id = $('#storedFilter_id').val(); 
    // send filter ID 
    aoData.push(
     { "name": "filter_id", "value": $.trim(filter_id) } 
    ); 
    $.getJSON(sSource, aoData, function (json) { 
     // check for expired session being returned, if so, send the user back to the login page 
     if(json.error == 'expired'){ 
      document.location.href='index.cfm?fuseaction=login.form';  
     } 
     else{ 
      fnCallback(json) 
     } 

    }); 
} 

在您应该返回一个JSON字符串这样阿贾克斯来源响应:

{"error": "expired"} 
1

下面的技术工作了我...我知道这是为时已晚,但希望代码将帮助某人

1)检查会话超时在控制器(MVC),并返回其应在客户端

if (!Request.IsAuthenticated) 
{ 
    return new HttpStatusCodeResult((HttpStatusCode)302, "Authentication timeout"); 
} 

2)在客户端使用jQuery全局AJAX错误,它可以捕获来自所有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); 
}); 
0

1.使用这个代码中的错误的获取ajax错误页面。或者也使用页脚file.this代码在会话超时后重定向到登录页面没有得到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); 

2.click按钮调用函数的时间越来越error..put一条线在功能上

$.fn.dataTable.ext.errMode = 'none'; 

像一个例子

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