Struts2拦截器

简单了解拦截器 

 拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。 拦截器链,也被称为拦截器栈。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

Struts 2已经提供丰富多样的,功能齐全的拦截器实现。具体可以到struts2-core-2.3.16.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

如果想要使用struts2自带拦截器,只需要在应用程序struts.xml文件中将package中继承其中的struts-default,然后在action配置中,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈。

需要注意: 一旦package继承了struts-default,该package中所有的action都会调用拦截器栈 ——defaultStack。但是,如果在action配置中加入“<interceptor-ref name=”xx“ />”,默认的defaultStack拦截器栈将不起作用。

这里测试记录登录日志的拦截器(使用方法一)----自定义拦截器使用

自定义拦截器的三个方法:

方法一:实现Interceptor接口

方法二:继承AbstractInterceptor类

方法三:继承MethodFilterInterceptor类

LoginInterceptor.java
 1 package com.cy.interceptor;
 2 
 3 import java.util.Date;
 4 
 5 import org.apache.struts2.ServletActionContext;
 6 
 7 import com.cy.action.LoginAction;
 8 import com.cy.entity.User;
 9 import com.opensymphony.xwork2.ActionInvocation;
10 import com.opensymphony.xwork2.interceptor.Interceptor;
11 /**
12  * 登录日志拦截
13  * @author acer
14  *
15  */
16 public class LoginInterceptor implements Interceptor {
17 
18     
19     private static final long serialVersionUID = 1L;
20 
21     @Override
22     public void destroy() {
23     }
24 
25     @Override
26     public void init() {
27     }
28 
29     @Override
30     public String intercept(ActionInvocation invocation) throws Exception {
31         
32         //获取目标对象
33         LoginAction login=(LoginAction) invocation.getAction();
34         System.out.println("拦截前:"+ new Date().getTime());
35         String str= login.execute();//在该拦截器后没有其他拦截器的情况下调用
36 //        invocation.invoke();//在该拦截器后有其他拦截器的情况下调用
37         User user= (User) ServletActionContext.getRequest().getAttribute("user");
38         if(user!=null){
39             //记录登录日志
40         }        
41         System.out.println("拦截后:"+ new Date().getTime());
42         return str;
43     }
44 
45 }

在struts.xml里的设置

 1  <!--定义拦截器 放在package里 并要求继承 struts-default -->
 2     <interceptors>
 3             <interceptor name="loginInterceptor" class="com.cy.interceptor.LoginInterceptor"></interceptor>
 4       <!--  <interceptor name="exitInterceptor" class="com.cy.interceptor.ExitInterceptor"></interceptor> -->
 5        
 6        <!-- 定义一个拦截器栈 -->
 7        <interceptor-stack name="logStack">
 8                 <interceptor-ref name="loginInterceptor"></interceptor-ref>
 9           <!--  <interceptor-ref name="exitInterceptor"></interceptor-ref>  -->
10        </interceptor-stack>
11     </interceptors>
12     

 

1  <action name="login" class="com.cy.action.LoginAction">
2              <!-- 显示配置引用Struts2默认的拦截器 defaultStack -->
3             <interceptor-ref name="defaultStack"></interceptor-ref>
4             <!--自定义拦截器  -->
5             <interceptor-ref name="loginInterceptor"></interceptor-ref>
6         </action>

LoginAction.java 部分代码;

 1 public String execute(){
 2         System.out.println("++"+user.getUserName());
 3         System.out.println("=="+user.getPassword());
 4     
 5         if(user.getUserName().equals("kitty")&&user.getPassword().equals("hello")){    
 6             ServletActionContext.getRequest().getSession().getAttribute("user");
 7             return SUCCESS;
 8         }
 9         else {
10             return ERROR;
11         }
12         
13     }

显示结果:

 

posted @ 2015-12-29 23:19  NAYNEHC  阅读(289)  评论(0编辑  收藏  举报