Struts2拦截器
2015-12-29 23:19
429 查看
简单了解拦截器
拦截器,在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类
在struts.xml里的设置
LoginAction.java 部分代码;
显示结果:
拦截器,在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
package com.cy.interceptor; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.cy.action.LoginAction; import com.cy.entity.User; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; /** * 登录日志拦截 * @author acer * */ public class LoginInterceptor implements Interceptor { private static final long serialVersionUID = 1L; @Override public void destroy() { } @Override public void init() { } @Override public String intercept(ActionInvocation invocation) throws Exception { //获取目标对象 LoginAction login=(LoginAction) invocation.getAction(); System.out.println("拦截前:"+ new Date().getTime()); String str= login.execute();//在该拦截器后没有其他拦截器的情况下调用 // invocation.invoke();//在该拦截器后有其他拦截器的情况下调用 User user= (User) ServletActionContext.getRequest().getAttribute("user"); if(user!=null){ //记录登录日志 } System.out.println("拦截后:"+ new Date().getTime()); return str; } }
在struts.xml里的设置
<!--定义拦截器 放在package里 并要求继承 struts-default --> <interceptors> <interceptor name="loginInterceptor" class="com.cy.interceptor.LoginInterceptor"></interceptor> <!-- <interceptor name="exitInterceptor" class="com.cy.interceptor.ExitInterceptor"></interceptor> --> <!-- 定义一个拦截器栈 --> <interceptor-stack name="logStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <!-- <interceptor-ref name="exitInterceptor"></interceptor-ref> --> </interceptor-stack> </interceptors>
<action name="login" class="com.cy.action.LoginAction"> <!-- 显示配置引用Struts2默认的拦截器 defaultStack --> <interceptor-ref name="defaultStack"></interceptor-ref> <!--自定义拦截器 --> <interceptor-ref name="loginInterceptor"></interceptor-ref> </action>
LoginAction.java 部分代码;
public String execute(){ System.out.println("++"+user.getUserName()); System.out.println("=="+user.getPassword()); if(user.getUserName().equals("kitty")&&user.getPassword().equals("hello")){ ServletActionContext.getRequest().getSession().getAttribute("user"); return SUCCESS; } else { return ERROR; } }
显示结果:
相关文章推荐
- 多线程之线程创建的两种方法(Java)
- Java中的自动拆装箱
- 接口强化练习(Java)
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(七)之Access Control
- Java中的常量如何避免反模式
- java基础05
- Eclipse Che安装依赖
- Java 实现根据 IP 地址获取地理位置的代码分享
- Struts2文件上传
- MyEclipse中Debug不进断点
- java基于RXTXcomm.jar的串口通信
- JAVA基础04
- javaMail学习二 电子邮件的工作原理
- 2015/12/29 Java语言概述 操作中注意事项
- java学习_文件工具类
- java代码优化总结1
- 图的理解:存储结构与邻接矩阵的Java实现
- web IDE Eclipse Che安装
- Java多线程之ThreadLocal
- java instanceof 用法 对象转型(casting)