1. 前提
最近接到的一个需求是登录并发人数控制——也就是对于同一个帐号,每次只能有最多X个人数同时在线。关于这个,开涛在其Shiro系列博客已经有过详尽的叙述,而正巧我们这个项目也是使用的Shiro,这真是刚想瞌睡就有人送上枕头。一路畅通无阻之后,发现了一个需要绕一下的问题——我们的前端主要使用EasyUI,而EasyUi虽然依托于JQuery,但其Datagrid组件接管了JQuery提供的默认错误处理函数,所以我们需要稍微兼容下。
2. 实现
经过跟踪堆栈,最终发现如下调用:
然后回去反查EasyUI提供的文档:
虽然官方文档里显示是没有事件参数,但经过上面的源码追踪,我们可以确定其实是存在着一个事件对象的。所以我们的解决方案如下(以下代码可以放在对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;
}
}
}
});