配置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(){
}