一、如何自定义一个拦截器?
自定义一个拦截器需要三步:
自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。
public class CheckLoginInterceptor extends AbstractInterceptor { public static final String LOGIN_KEY = "LOGIN"; public static final String LOGIN_PAGE = "global.login"; public String intercept(ActionInvocation actionInvocation) throws Exception { System.out.println("begin check login interceptor!"); // 对LoginAction不做该项拦截 Object action = actionInvocation.getAction(); if (action instanceof LoginAction) { System.out.println("exit check login, because this is login action."); return actionInvocation.invoke(); } // 确认Session中是否存在LOGIN Map session = actionInvocation.getInvocationContext().getSession(); String login = (String) session.get(LOGIN_KEY); if (login != null && login.length() > 0) { // 存在的情况下进行后续操作。 System.out.println("already login!"); return actionInvocation.invoke(); } else { // 否则终止后续操作,返回LOGIN System.out.println("no login, forward login page!"); return LOGIN_PAGE; } } 将上述拦截器设定为默认拦截器: <default-interceptor-ref name="teamwareStack"/> 这样在后续同一个package内部的所有Action执行之前都会被login拦截。
在strutx.xml中注册上一步中定义的拦截器
<interceptors> <interceptor name="login" class="com.jpleasure.teamware.util.CheckLoginInterceptor"/> <interceptor-ref name="login"/> <!-- 加入默认拦截器栈 --> <interceptor-ref name="defaultStack"/> </interceptors>
在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
<action name="login" class="tutorial.Login"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <result name="input">login.jsp</result> <result name="success" type="redirect-action">/secure/home</result> </action>
二、需要说明的几点
可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。
<interceptors> <interceptor name="timer" class=".."/> <interceptor name="logger" class=".."/> <interceptor-ref name="logger"/> </interceptors> <action name="login" class="tutuorial.Login"> <interceptor-ref name="myStack"/> <result name="success" type="redirect-action">/secure/home</result> </action>
设置默认拦截器
<!--设置默认拦截器,放在interceptors标签后--> <default-interceptor-ref name="myStack"/>
拦截器执行的顺序按照定义的顺序执行
使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:
<action name="login" class="tutorial.Login"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="default-stack"/> <result name="input">login.jsp</result> <result type="redirect-action">/secure/home</result> </action> //可以改成 <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="default-stack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack" /> <action name="login" class="tutorial.Login"> <result name="input">login.jsp</result> <result type="redirect-action">/secure/home</result> </action>
访问request,session
request = (HttpServletRequest) arg0.getInvocationContext().get(ServletActionContext.HTTP_REQUEST); session = request.getSession();