1 在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。 2 3 4 5 我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性) 6 如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为: 7 8 public class CheckLoginInterceptor extends AbstractInterceptor { 9 10 public static final String LOGIN_KEY = "LOGIN"; 11 12 public static final String LOGIN_PAGE = "global.login"; 13 14 15 16 public String intercept(ActionInvocation actionInvocation) throws Exception { 17 18 19 20 System.out.println("begin check login interceptor!"); 21 22 // 对LoginAction不做该项拦截 23 24 Object action = actionInvocation.getAction(); 25 26 if (action instanceof LoginAction) { 27 28 System.out.println("exit check login, because this is login action."); 29 30 return actionInvocation.invoke(); 31 32 } 33 34 35 36 // 确认Session中是否存在LOGIN 37 38 Map session = actionInvocation.getInvocationContext().getSession(); 39 40 String login = (String) session.get(LOGIN_KEY); 41 42 if (login != null && login.length() > 0) { 43 44 // 存在的情况下进行后续操作。 45 46 System.out.println("already login!"); 47 48 return actionInvocation.invoke(); 49 50 } else { 51 52 // 否则终止后续操作,返回LOGIN 53 54 System.out.println("no login, forward login page!"); 55 56 return LOGIN_PAGE; 57 58 } 59 60 } 61 62 }
如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):
<interceptor-ref name="checkbox">
<param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
(必须加,否则出错)
也可以改为对全局Action设置自己需要的拦截器,如下:
在struts.xml里面定义全局的配置设置
<package name="struts-shop" extends="struts-default">
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="checkbox">
<param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
</package>
struts-action.xml里面配置Action如下:
<package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)
<action name="logon" class="logonAction">
<result>/jsp/smeishop/admin/index.jsp</result>
<result name="error">/jsp/smeishop/admin/logon.jsp</result>
<result name="input">/jsp/smeishop/admin/logon.jsp</result>
</action>
<action name="logout" class="logoutAction">
<result>/jsp/smeishop/admin/logon.jsp</result>
</action>
</package>
1 //注册拦截器 2 3 <interceptors> 4 5 <interceptor 6 7 name="login" 8 9 class="com.jpleasure.teamware.util.CheckLoginInterceptor"/> 10 11 <interceptor-stack name="teamwareStack"> 12 13 <interceptor-ref name="login"/> 14 15 <interceptor-ref name="defaultStack"/> 16 17 </interceptor-stack> 18 19 </interceptors>
2 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:
1 <action name="login" class="tutorial.Login"> 2 3 <interceptor-ref name="timer"/> 4 5 <interceptor-ref name="logger"/> 6 7 <interceptor-ref name="default-stack"/> 8 9 10 11 <result name="input">login.jsp</result> 12 13 <result type="redirect-action">/secure/home</result> 14 15 </action>
可以按照如下的方式定义:
1 <interceptors> 2 3 <interceptor-stack name="myStack"> 4 5 <interceptor-ref name="timer"/> 6 7 <interceptor-ref name="logger"/> 8 9 <interceptor-ref name="default-stack"/> 10 11 </interceptor-stack> 12 13 </interceptors> 14 15 16 17 <default-interceptor-ref name="myStack"/> 18 19 20 21 <action name="login" class="tutorial.Login"> 22 23 <result name="input">login.jsp</result> 24 25 <result type="redirect-action">/secure/home</result> 26 27 </action>
3 如何访问HttpServletRequest,HttpServletResponse或者HttpSession
有两种方法可以达到效果,使用ActionContext:
Map attibutes = ActionContext.getContext().getSession();
或者实现相应的接口:
HttpSession SessionAware
HttpServletRequest ServletRequestAware
HttpServletResponse ServletResponseAware
//获取request请求 HttpServletRequest request = ServletActionContext.getRequest(); //获取session请求 HttpSession sess = ServletActionContext.getRequest().getSession(); ActionContext actioncontext = ActionContext.getContext(); Map session = actioncontext.getSession();