简单了解拦截器
拦截器,在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 }
显示结果: