这个问题看似很简单,但当你从传统的this.SUCCESS,this.ERROR同步方式转向Ajax异步方式的时候问题就来了,你如何在加载页面后进行进行异步数据请求时进行验证?如果按正常方案,Struts通过拦击器发现你的请求,然后转发给响应的action进行处理,处理完成action进行页面返回,然而,异步的时候呢,你是要每次都通过页面去请求认证拦截器一次么?这个是非常愚蠢的想法,因为你每次请求都需要主动去调用返回能调用,再去调用正常逻辑,这违反了拦截器原本的意图,让你面向切面编程,切面的过滤条件,认证条件不需要你管,所以正确的做法自然是放到调用的报文头中:
//session超时全局处理
function isSESSIONOOUT(){
$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
complete:function(XMLHttpRequest,textStatus){
var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");
var permistatus=XMLHttpRequest.getResponseHeader("permistatus");
if(sessionstatus=="timeout"){
window.location.replace("${pageContext.request.contextPath}/sessionout.jsp");
}
if(permistatus=="nopermi"){
window.location.replace("${pageContext.request.contextPath}/nopermi.jsp");
}
}
});
}
ajax全局处理,处理什么,当一个请求过去的时候,拦击器发现是ajax的方式,就会把http报头写入鉴权判断和超时判断,代码如下:
String userId = SessionManage.getUserId();
if (userId == null) {
logger.debug("你需要重新登录" + type);
if ("XMLHttpRequest".equalsIgnoreCase(type)) {
response.setHeader("sessionstatus", "timeout");
result = null;
} else {
result = ActionSupport.LOGIN;
}
} else {
//前提必须先登录再判断权限,如果权限列表没有收录该action数据,则默认登录者有此权限,不做操作防范处理
boolean hasPerm=securityPermission.hasPerm(action, actionName);
if (hasPerm) {
result = invocation.invoke();
} else {
response.setHeader("permistatus", "nopermi");
result = null;
}
}
//session超时全局处理
function isSESSIONOOUT(){
$.ajaxSetup({
contentType:"application/x-www-form-urlencoded;charset=utf-8",
complete:function(XMLHttpRequest,textStatus){
var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");
var permistatus=XMLHttpRequest.getResponseHeader("permistatus");
if(sessionstatus=="timeout"){
window.location.replace("${pageContext.request.contextPath}/sessionout.jsp");
}
if(permistatus=="nopermi"){
window.location.replace("${pageContext.request.contextPath}/nopermi.jsp");
}
}
});
}
ajax全局处理,处理什么,当一个请求过去的时候,拦击器发现是ajax的方式,就会把http报头写入鉴权判断和超时判断,代码如下:
String userId = SessionManage.getUserId();
if (userId == null) {
logger.debug("你需要重新登录" + type);
if ("XMLHttpRequest".equalsIgnoreCase(type)) {
response.setHeader("sessionstatus", "timeout");
result = null;
} else {
result = ActionSupport.LOGIN;
}
} else {
//前提必须先登录再判断权限,如果权限列表没有收录该action数据,则默认登录者有此权限,不做操作防范处理
boolean hasPerm=securityPermission.hasPerm(action, actionName);
if (hasPerm) {
result = invocation.invoke();
} else {
response.setHeader("permistatus", "nopermi");
result = null;
}
}
这样一个http请求,用header隐藏了权限安全和有效登录状态,自然是异步过滤的最佳方式,切记ajax需要全局的ajaxSetup处理,否则给客户端造成开销负担或者线程安全隐患,这是我们不愿意看到的
郑州就维 www.zzjiuwei.com