EasyUI技巧——DataGrid组件的错误统一处理

时间:2024-03-19 19:38:05

1. 前提

最近接到的一个需求是登录并发人数控制——也就是对于同一个帐号,每次只能有最多X个人数同时在线。关于这个,开涛在其Shiro系列博客已经有过详尽的叙述,而正巧我们这个项目也是使用的Shiro,这真是刚想瞌睡就有人送上枕头。一路畅通无阻之后,发现了一个需要绕一下的问题——我们的前端主要使用EasyUI,而EasyUi虽然依托于JQuery,但其Datagrid组件接管了JQuery提供的默认错误处理函数,所以我们需要稍微兼容下。

2. 实现

经过跟踪堆栈,最终发现如下调用:
EasyUI技巧——DataGrid组件的错误统一处理

然后回去反查EasyUI提供的文档:
EasyUI技巧——DataGrid组件的错误统一处理

虽然官方文档里显示是没有事件参数,但经过上面的源码追踪,我们可以确定其实是存在着一个事件对象的。所以我们的解决方案如下(以下代码可以放在对easyui控件进行扩展的专门JS文件中,进行选择性导入):

$.extend($.fn.datagrid.defaults, {
	onLoadError : function(rv){
		var data = rv.responseJSON;
		if (kq.assert.isNotEmpty(data) && kq.assert.isNotEmpty(data.code)) {
			switch (data.code) {
				case 1: break;  // LOGIN
				case -1:  // NO_LOGIN
				case -2:  // NO_PERMISSION
					// 当前页面不属于登录界面时
					if (window.top.location.href.indexOf(data.data) < 0) {
						window.top.alert("登录超时,请重新登录!");
						window.top.location.href = common.context + data.data;
					}
					break;
				case -3:
					if (window.top.location.href.indexOf(data.data) < 0) {
						window.top.alert("当前账号已在其它地方登录, 您已被强制退出!");
						window.top.location.href = common.context + data.data;
					}
					break;
				default:
					window.top.alert("未知错误, 错误码为: [ " + data.code + " ]");
					break;
			}
		}
	}
});

3. Links

  1. ajax请求重定向
  2. 第十八章 并发登录人数控制——《跟我学Shiro》