标签:
对于session过期跳转的问题,很简单,就是一个过滤器,然后判断session为空?跳转:继续。但是对于ajax的请求,需要做特殊处理,见下面代码中的
// 此处考虑ajax操作session过期的操作,如果ajax请求过程中session过期,则指定过期状态码为:911.
String requestType = req.getHeader("X-Requested-With");
因为ajax请求的时候请求头是:X-Requested-With,so我们可以根据该请求头做session过期处理。
下面是过滤器的实现,可以作为参考。
if (currUser == null) {
// 用户未登录
if (isAjaxRequest(req)) {
handleNoAuthorityResponse(rsp, 401);
}
rsp.sendError(401);
log.info("Unknow session {}. User did not login.", session);
return;
}
/**
* 判断是否是ajax请求
*
* @param request
* @return
*/
private boolean isAjaxRequest(HttpServletRequest request) {
String header = request.getHeader("X-Requested-With");
if (header != null && "XMLHttpRequest".equals(header))
return true;
else
return false;
}
private void handleNoAuthorityResponse( HttpServletResponse rsp, int code ) {
BaseJson error = new BaseJson();
switch (code) {
case 401:
// 会话失效
rsp.setHeader("sessionstatus", "timeOut");
error.setRetcode("E-0099");
error.setErrorMsg("会话失效,请重新登陆!");
break;
case 403:
rsp.setHeader("sessionstatus", "403");
error.setRetcode("E-0098");
error.setErrorMsg("权限不足,请与管理员联系!");
break;
default:
error.setRetcode("E-0098");
error.setErrorMsg("权限不足,请与管理员联系!");
break;
}
JSONObject jsonObject = JSONObject.fromObject(error);//需要转换为JSON,否则无法返回到前台
PrintWriter writer = null;
try {
writer = rsp.getWriter();
writer.print(jsonObject);
} catch (IOException e) {
e.printStackTrace();
}
}
JS代码:
var sessionTimeCount=0;
$.ajaxSetup({
error : function(x, status, e) {
if (x.status == ‘403‘) {
alert(‘您没有权限执行当前操作!‘);
} else {
console.log(‘系统错误,请联系管理员!‘);
}
return false;
},
complete : function(r, s) {
var status = r.getResponseHeader(‘sessionstatus‘);
if (status == ‘timeOut‘) {
if(sessionTimeCount==0){
alert(‘会话过期,请重新登录‘);
top.location.href="${pageContext.request.contextPath}/web/jsp/login.jsp";
}
sessionTimeCount++;
}
}
});
标签:
原文地址:http://www.cnblogs.com/sdream/p/5151303.html