Struts2自定义拦截器
前面已经转载过一份关于Struts2拦截器的详细分析,这里就不写的那么清楚了,简单的写一个Struts2 对session的拦截器。
首先 明确一下我们的页面流程:
userLogout.action 当我们执行这个操作的时候,应该进入退出界面。
http://localhost:8080/OA/userLogout.action
问题在于,如果我们没有登录,或者说session过期了。我们还能进入这个页面吗?显然是不应该进入的,应该跳转到登录界面。如果是一个action我们可以在action里面进行对session的获取和相应参数的判断,但是多个action都重复这一个过程就有些臃肿了,我们可以用struts2的拦截器来实现这个过程。
1:我们先定义一个拦截器:
我们看到的ActionContext以及Map类型的session,只是Struts2获取servlet支持的一种方式,还可以用继承Aware接口的方式。这个就不再深究了。invocation的invoke方法是有拦截器就接着往下执行,没有就执行真正的action。最后return Action.LOGIN就跟我们经常用的return SUCCESS一样,都是父类给定义好的,我们直接用而已。
package com.oa.interceptor; import java.util.Map; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * * @author: zhao * @time: 2016年5月3日 * * @description:Struts2拦截器,判断当前用户是否在线,即在session中是否有记录,session默认不工作十分钟便销毁 */ public class SessionInterceptor extends AbstractInterceptor{ private static final long serialVersionUID = 1L; @Override public String intercept(ActionInvocation invocation) throws Exception { ActionContext context=invocation.getInvocationContext(); Map<String, Object> session=context.getSession(); String id=(String) session.get("id"); if(id!=null&&!"".equals(id)){ return invocation.invoke(); } return Action.LOGIN; } }
2:struts.xml
我们定义了把自己写好的拦截器类在下面定义好了,名字是sessionInterceptor,又定义了一个拦截器栈,把我们的自己写的拦截器和系统默认的拦截器都写在了一起。这是因为当我们使用了自定义拦截器时,默认拦截器就不起作用了,所以必须必须把默认拦截器显式的写在下面。
<package name="default" extends="struts-default"> <interceptors> <interceptor name="sessionInterceptor" class="com.oa.interceptor.SessionInterceptor"></interceptor> <interceptor-stack name="systemStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="sessionInterceptor"/> </interceptor-stack> </interceptors> </package>
3:strtus_system.xml
我把这个文件的内容进行了删减,留下来最直观的东西。有一个全局的结果,name是login,这个和上面自定义拦截器中的Action.Login是对应的。现在我们的userLogoutAction用的是默认的拦截器栈,所以才会出现最上面那种直接进入退出界面的结果,这显然是不对的。
<package name="system" extends="default"> <global-results> <result name="login">/WEB-INF/content/home.jsp</result> </global-results> <action name="userLogout" class="com.oa.action.UserLogoutAction"> <interceptor-ref name="defaultStack" /> <result>/WEB-INF/content/exit.jsp</result> </action> </package>
4:修改struts_system.xml
把拦截器引用改成我们写好的拦截器栈就好了,这个拦截器栈中有默认的拦截器,所以不用担心别的界面不能中英文切换的问题。现在再执行一次看看效果
<action name="userLogout" class="com.oa.action.UserLogoutAction"> <interceptor-ref name="systemStack" /> <result>/WEB-INF/content/exit.jsp</result> </action>