在Datatables中处理会话超时(使用服务器端数据源处理)
我有一个由服务器端Ajax数据源支持的数据表格形式(它在后端使用struts动作来处理请求,获取数据并发送一个JSON响应)。 服务器端操作需要以认证模式运行,即需要有活动会话。在Datatables中处理会话超时(使用服务器端数据源处理)
在Datatables中处理会话超时错误的最佳方法是什么?目前它只显示JSON格式错误,这对用户来说不是最好的选择。我不想去显示数据表代码(兼容性,未来可维护性等)。有没有一种整洁的方式来处理错误?
我一直在思考如何在JSON响应中嵌入错误消息,但在前端流程中哪里是拦截它的最佳位置?
编辑:我认为做这种后期处理的最佳场所将在fnServerData中,我是否正确?
我会触发一个包含某种错误代码的JSON响应。为了处理它,你需要定义你所猜测的fnServerData。不过,在使用错误回调之前,我会强烈考虑这个用例,因为这个原因:
错误是取回资源并使用状态码的任何问题。假设会话在服务器上终止。用户请求数据,服务器发回500错误。错误回调说:“好吧,那个吸引人,让我们重定向到一个登录页面。”一切都很好。
但是...用户提出请求。无论出于何种原因(大数据集,网络条件),请求都需要一点时间。同时,用户决定导航到另一个页面,中断呼叫 - 响应循环。没有响应时,错误回调被触发,用户被重定向到一个登录页面(或者错误回调中设置的任何函数)。
问题是没有我知道的状态代码(我很想知道,虽然!我不介意在这里错了!)'会话已过期'以捕获和处理。
我不是说你“不应该”或“不能”使用错误回调。但该功能必须考虑到会话过期以外的错误。您可能需要根据状态代码进行不同的处理。如果你的函数优雅地处理所有这些情况,太好了!在一个应用程序中,我们确实重定向到登录页面,并且错误回调经常会由于误报而跳机,并将用户错误地转储到登录页面。对于“会话过期”的情况,我们通过JSON消息在成功回调中捕获它。如果你有你的服务器返回一个有用的服务器错误(401,403,550或者你的场景中有意义的东西),那么在.ajax()调用中使用带有statusCode参数的fnServerData(这真是太棒了!)也同样适用。我认为这是相同的工作量:通过您已经编写的方法返回JSON,或者通过您应该有权访问的方法返回状态错误。选择哪一个对你有意义。
刚发现.ajax中的statusCode参数,这可能有助于这方面的事情。我仍然会使用过期会话的成功处理程序,以及statusCode或其他问题的错误。 –
如果用户离开页面,Ajax请求将消失,并且不会触发回调,否?服务器是否发回成功或错误的HTTP代码是一个偏好和域的问题。国际海事组织要求召开会议,但没有人应该返回一个“禁止”代码,因为这是事实。 –
你会想。我不确定涉及到什么魔法,但如果您在请求中间离开,回调的确会触发。不过,禁止代码是一个好主意。使用statusCode参数处理它也很容易。如果您的应用程序不需要区分会话到期时间和其他禁止状态,我倾向于作为更好的解决方案。 –
我一直在使用比尔·马蒂诺在这里回答了这事 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)检查会话超时在控制器(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);
});
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();
}
这是正确的;只需定义一个'error'回调。 –