Struts拦截器使用

 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();

 

 

 

 

posted @ 2012-09-08 15:34  小伙、不一般  阅读(290)  评论(0编辑  收藏  举报