目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题。

可能需要处理的问题:Session超时、系统500错误、普通的业务错误、权限不足。

同步请求:

Session超时,登录拦截器,重定向到登录页面。

500等系统错误,SpringMVC自定义ExceptionHanlder,跳转到系统错误页面,给访客友好的提示。

业务错误和权限不足,与500类似。

相对而言,同步方式,处理起来还是比较容易的。

异步请求:

2种方式

1.后端登录拦截器,发现Session超时,给个标记。

后端系统错误捕捉,给个标记。

比如:

if (CommonUtil.isAjaxRequest(request)) {
response.setHeader(BERROR, "yes");
CommonUtil.jsonError(response);
return null;
}

前端

$(function() {
$.ajaxSetup({
contentType : "application/json;charset=utf-8",
complete : function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,
var blogin = XMLHttpRequest.getResponseHeader("blogin");
if (blogin == "yes") {
alert("Session time out2");
window.location = "${frontLoginUrl}";
}
var berror = XMLHttpRequest.getResponseHeader("berror");
if (berror == "yes") {
alert("Session error2");
}
}
});
});
2. 封装jquery的post方法。
function post(url, params, fn) {
$.post(url, params, function(data) {
if(data.code==-1){
alert("Session time out");
return;
}
if(data.code==-5){
alert("System error.");
return;
}
if(data.code ==0){
alert("出了点小问题,"+data.msg);
return;
}
if(data.code == -2){
alert("权限不足,请联系网站管理员.");
return;
}
fn(data);
});
}

调用方式:

post(base + "/home/bankcard/doadd.json", {
"bank" : bank,
"card" : card
}, function(data) {
}

补充几点

1.后端拦截器加标记。

好处是:前端用ajaxSetup,前端没有干扰到任何已有的代码。比如原来$.post不用修改。

坏处是:后端要改。

2.前端统一封装post,正好反过来。

前端需要修改已有的代码。

后端不需要修改。

Ajax请求Session超时解决