struts项目需要用到拦截器,用于校验session是否过期以及用户是否已登录,session过期和用户未登录则跳转到登录界面。
首先是在struts的配置文件struts.xml里进行拦截器bean的配置,代码如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="spring" />
<constant name="struts.devMode" value="false" />
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.i18n.encoding" value="utf-8" />
<constant name="struts.action.excludePattern" value="/services.*"/>
<package name="sessionOut" extends="struts-default" >
<interceptors>
<interceptor name="sessionout" class="com.test.SessionIterceptor" />
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="sessionout" />
</interceptor-stack>
</interceptors>
<!-- 定义全局Result -->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面 -->
<result name="login">/back/logon.jsp</result>
</global-results>
<package name="dept" extends="sessionOut" namespace="/dept">
<action name="deptAction" class="deptAction" method="displayDepts">
<interceptor-ref name="mydefault" />
<result name="displayDepts">/listDepts.jsp</result>
</action>
</package>
</struts>
然后编写SessionIterceptor类,代码如下:
@SuppressWarnings("serial")
public class SessionIterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
try {
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
Object userName = session.get("userId").toString();
if (userName != null ) {
return actionInvocation.invoke();
} else {
return Action.LOGIN;
}
} catch (Exception e) {
return Action.LOGIN;
}
}
}