处理Datatables中的会话超时(使用服务器端数据源处理)
Handling session time-outs in Datatables (with server-side datasource processing)
我有一个由服务器端Ajax数据源支持的数据表表单(它在后端使用struts操作来处理请求、获取数据并发送JSON响应(。服务器端操作需要以身份验证模式运行,即需要有一个活动会话。
处理Datatables中会话超时错误的最佳方法是什么?目前,它只显示了一个JSON格式错误,这对用户来说不是最好的选择。出于明显的原因(兼容性、未来可维护性等(,我不想去更改数据表代码。有没有一种巧妙的方法来处理错误?
我一直在考虑在JSON响应中嵌入错误消息,但在前端流中,哪里是拦截错误消息的最佳位置?
编辑:我认为进行这种后期处理的最佳位置是在fnServerData中,我说得对吗?
我会返回一个包含某种错误代码的JSON响应。要处理它,您需要按照您的推测定义fnServerData。然而,在使用错误回调之前,我会强烈考虑这个用例,原因如下:
错误只是获取资源的任何问题,并使用状态代码。假设会话在服务器上终止。用户请求数据,服务器返回500错误。错误回调说:"好吧,太糟糕了。让我们重定向到登录页面。"一切都很好。
然而。。。用户进行请求。无论出于何种原因(大数据集、网络条件(,请求都需要一点时间。与此同时,用户决定导航到另一个页面,从而中断呼叫响应循环。在没有响应的情况下,错误回调被触发,用户被重定向到登录页面(或错误回调中设置的任何函数(。
问题是,我不知道"会话已过期"的状态代码(不过我很想知道!我不介意这里错了!(,以便捕获和处理。
我并不是说你"不应该"或"不能"使用错误回调。但该函数必须考虑会话到期之外的其他错误。您可能需要根据状态代码进行不同的处理。如果您的函数能够优雅地处理所有这些情况,那就太好了!在一个应用程序中,我们确实重定向到登录页面,错误回调通常会由于误报而中断,从而将用户错误地转储到登录页面。对于"会话过期"的情况,我们通过JSON消息在成功回调中捕获它。
[在Dave的精彩评论后更新:]如果你的服务器返回了一个有用的服务器错误(401403550或任何在你的场景中有意义的错误(,那么在.ajax((调用中使用带有statusCode参数的fnServerData(这太难了!(也同样有效。我认为这是同样的工作量:通过您已经编写的方法返回JSON,或者通过您应该已经可以访问的方法返回状态错误。选择哪一个对您有意义。
以下技术对我有效。。。我知道已经来不及回应了,但希望代码能帮助
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);
});
尽管这个问题已经问了很长时间了,但如果有人需要,我会发布我的解决方案。
此解决方案适用于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";
}
}
只需将YourErrorCode替换为所需,它就会工作。我承认这不是有史以来最干净的代码,但它确实有效。
我已经使用bill martino的答案完成了这项工作: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)
}
});
}
在Ajax Source响应中,您应该返回一个Json字符串,如下所示:
{"error": "expired"}
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);
2.点击调用的按钮,此时出现错误。。将一行放入功能
$.fn.dataTable.ext.errMode = 'none';
像一个示例
function ChangeUrl(){
$.fn.dataTable.ext.errMode = 'none';
product_table.fnStandingRedraw();
}
- 提示使用服务器端事件处理程序激活JavaScript
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- datatables+lengthMenu+All+服务器端处理+不工作
- 使用新参数通过服务器端处理重新绘制引导数据表
- 如何在不使用处理程序的情况下使用ajax将文件从客户端发送到服务器端
- 将 JSON 对象转换为序列化字符串以进行服务器端处理
- 数据表 + 列搜索 + 整体搜索协同工作 + 服务器端处理
- 数据表 + 服务器端处理 + 搜索筛选
- 模式弹出服务器端处理
- 在服务器端禁用 aspxgridviews,如何在客户端处理
- 为什么不允许在jquery数据表服务器端处理ajax中使用成功
- 如何使用webpack处理仅在运行时可用的服务器端依赖关系
- 将数据存储在javascript中以供服务器端处理
- 正在使用服务器端处理导出筛选的DataTable(CodeIgniter)
- 用于处理QRCode生成服务器端并存储在数据库中的库
- Do Flux(通过Facebook)使用套接字处理服务器端更新
- 用于处理服务器端事件的PHP服务器导致Apache连接过多
- 谷歌地图处理服务器端
- 在ASP.NET中处理服务器端数据的Javascript
- 在模态表单中处理服务器端验证的最佳实践