Struts2+ajax如何进行拦截器认证

这个问题看似很简单,但当你从传统的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;
}
}

这样一个http请求,用header隐藏了权限安全和有效登录状态,自然是异步过滤的最佳方式,切记ajax需要全局的ajaxSetup处理,否则给客户端造成开销负担或者线程安全隐患,这是我们不愿意看到的



郑州就维 www.zzjiuwei.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值