配置struts.xml文件的默认拦截器(注:登录的action用<default-interceptor-ref name="defaultStack" />)
<interceptors> <interceptor name="loginInterceptor" class="com.fireinjava.ui.interceptor.LoginInterceptor" /> <interceptor-stack name="myDefaultIntegerceptor"> <interceptor-ref name="loginInterceptor" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefaultIntegerceptor" />
拦截器LoginInterceptor.java
package com.fireinjava.ui.interceptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.fireinjava.ui.UserEnv; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * @version 1.0 * @data 2009-9-23 * @描述:检查Session是否超时 */ public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation actioninvocation) throws Exception { ActionContext context = actioninvocation.getInvocationContext(); Map session = context.getSession(); UserEnv user = (UserEnv) session.get("userEnv"); System.out.println(">>>>>>>>>>>>>LoginInterceptor"); if (user != null) { return actioninvocation.invoke(); } else { outString("<script type=\"text/javascript\">var session='SessionExpired'; function getRootWin(){var win = window;while (win != win.parent){win =win.parent;}return win;} getRootWin().reLogin();</script>");//页面接收 } return Action.NONE; // 页面上写一个Login弹出窗口 } public void outString(String str) { HttpServletResponse response = ServletActionContext.getResponse(); try { response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("text/html;charset=gbk"); PrintWriter out = response.getWriter(); out.write(str); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }
jsp 页面代码:
<script type="text/javascript"> function getRootWin(){ var win = window; while (win != win.parent){ win = win.parent; } return win; } var reLoginWin; reLogin = function (){ getRootWin().reLoginWin=new Ext.Window(....);}//登录窗口 Ext.Ajax.on('requestcomplete', function(conn, response, options, e){ var returnVal=response.responseText; if(!Ext.isEmpty(returnVal)&&returnVal.indexOf('SessionExpired')!=-1) reLogin();}); </script>
嵌入外部页面时,保持本应用的Session激活
function keepSession(){
Ext.Ajax.request({url : 'keepSession.action'});
}
setInterval("keepSession()",60000);//1分钟调用下
<action name="keepSession" class="com.xx.BaseAction" method="keepSession"/>
public void keepSession(){
}