EXT 开发的项目 struts 拦截器问题

关于配置项目中应用ExtJs开发的拦截器,针对session过期后,点击任何操作都让页面跳转到登录界面。



编写好一个拦截器,先按常规配置好(那些配置拦截器的细节就不用说了吧,不会的请看下关于struts2的拦截器定义及其在struts.xml文件中的配置)。

先在拦截器里面判断session中是否存在’用户信息’,如果不存在则跳转到登录界面:

public String intercept(ActionInvocation arg0) throws Exception {

HttpSession session = ServletActionContext.getRequest().getSession();

if(session.getAttribute("user") == null){

log.info("用户没登录或登录过期,不能访问");

return "relogin";

}else{

log.info("用户已经登录,继续访问");

}

return arg0.invoke();

}



下面就开始对Ext部分进行拦截了,因为Ext中提交的方法最终都是属于Ajax异步提交,普通拦截器不做特殊处理,所以就还得在上面的代码里面做处理,如下所示:

public String intercept(ActionInvocation arg0) throws Exception {

HttpSession session = ServletActionContext.getRequest().getSession();

HttpServletResponse response = ServletActionContext.getResponse();

HttpServletRequest request = ServletActionContext.getRequest();

PrintWriter pw = response.getWriter();

if(session.getAttribute("user") == null){

String flag = "";

if(request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")){

log.info("用户没登录或登录过期,不能访问"); response.setCharacterEncoding("text/html;charset=utf-8");

response.setContentType("text/html;charset=utf-8");

flag = "9999";

pw.write(flag);

return null;

}else{

log.info("用户没登录或登录过期,不能访问");

return "relogin";

}

}else{

log.info("用户已经登录,继续访问");

}

return arg0.invoke();

}

解释一下 上面的if判断:

if(request.getHeader("X-Requested-With") != null && request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))

该判断就是针对Ext提交进行判断的,其中我设置了一个flag,该标志就是Ajax请求后回调方法中的内容;只有是Ext的Ajax请求时,那么才会输出这个标志。

最后在jsp页面上加上下面的js代码,当然,直接加在写Ext的js文件头部也行。

Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);

function checkUserSessionStatus(conn,response,options){

var str = response.responseText;

if(str == '9999'){

alert('连接已超时,请重新登录!');

window.parent.location = 'index.jsp';

}

}

上面这段js的意思就是,注册Ajax的requestcomplete方法;

用过Ajax的人都会知道,Ajax提交之后有几个方法,个success,failure,还有一个就是complete ,complete的执行是这样的,不管该Ajax请求成功与否,到最后都是执行complete方法,所以我们可以在complete方法里面做些扫尾工作;

那上面的requestcomplete是Ext中的Ajax请求的complete方法,不管Ext中的Ajax请求是否正确执行与否,它都会执行,所以我们就可以用该方法做文章,然后通过

var str = response.responseText;拿到在拦截器中的那个flag标识,判断是否存在自己设定的那个特定值,如果存在就进行跳转,

window.parent.location = 'index.jsp'; 我这里采用这句是因为我这个系统界面才用了frame框架,得先找到父框架然后才将index.jsp页面进行location;

这里基本上就完成了拦截器对Ext进行拦截跳转了;

更好的方法当然有,只是我没找到,最后通过这样的尝试,发现能成功拦截,也能算是可行,就将就着用了。

最后在说一点:有很多采用了frame框架的,进行登录界面跳转后,登录界面却出现在main框架中,而原先的top,和menu 还是在界面上显示,这个时候怎么办呢,解决办法还是有的,那就是在登录界面,如我上面是index.jsp,加个js方法,

function init(){

if (top.location != self.location){

top.location=self.location;

}

}

然后在index.jsp 的body的onload设置该js方法就OK了

<body οnlοad="init()">

这样跳转后,整个界面就会是完完整整的’登录界面’了.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Zsyzk/archive/2010/07/15/5737214.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值