Interceptor(拦截器),顾名思义,就是在某个事件发生之前进行拦截,并插入某些处理
过程。Servlet 2.3规范中引入的Filter 算是拦截器的一个典型实现,它在Servlet执行之前被触发,对输入参数进行处理之后,再将工作流程传递给对应的Servlet。
而今年来兴起的AOP(Aspect Oriented Programming),更是将Interceptor 的作用提升到
前所未有的高度。
Xwork 的Interceptor 概念与之类似。即通过拦截Action 的调用过程,为其追加预处理
和后处理过程。
自定义一个拦截器需要三步:
1.自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。 Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方法的拦截.
1.1 Interceptor接口声明了三个方法:
public interface Interceptor extends Serializable {
void destroy();
void init();
String intercept(ActionInvocation invocation) throws Exception;
}
Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post- constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。
Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。
Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用 invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。
1.2 AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:
public abstract class AbstractInterceptor implements Interceptor {
public void init() {}
public void destroy() {}
public abstract String intercept(ActionInvocation invocation) throws Exception;
}
在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。
1.3 MethodFilterInterceptor中有两个方法
setExcludeMethods:排除需要过滤的方法
setIncludeMethods:设置需要过滤的方法
如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截
2.在strutx.xml中注册上一步中定义的拦截器。
3.在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。
4.<default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
5.Interceptor拦截类型
5.1 before拦截,是指在拦截器中定义的代码,它们存在于invocation.invoke()代码执行之前。这些代码,将依照拦截器定义的顺序,顺序执行。
5.2 after拦截,是指在拦截器中定义的代码,它们存在于invocation.invoke()代码执行之后。这些代码,将一招拦截器定义的顺序,逆序执行。
5.3 PreResultListener拦截: 有的时候,before拦截和after拦截对我们来说是不够的,因为我们需要在Action执行完之后,但是还没有回到视图层之前,做一些事情。Struts2同样支持这样的拦截,这种拦截方式,是通过在拦截器中注册一个PreResultListener的接口来实现的。
分享到:
相关推荐
这可以通过`<interceptors>`标签来完成,定义拦截器栈并指定拦截器的顺序。 ```xml ``` 3. **应用拦截器**:接着,你需要在Action配置中指定要使用的拦截器栈。这样,每次请求到这个Action时,都会先...
通过`<interceptors>`标签定义拦截器栈,然后使用`<interceptor>`子标签创建拦截器实例。 - 使用`<interceptor-ref>`标签引用已定义的拦截器,并通过`name`属性指定。 - 使用`<default-interceptor-ref>`定义默认...
通过以上步骤,你可以创建并使用自己的Struts2拦截器。这使得我们可以灵活地扩展Struts2的功能,实现诸如登录检查、权限控制、事务管理等多种业务需求。在实际项目中,自定义拦截器是提升代码复用性和可维护性的重要...
1. **Struts2配置**:理解`struts.xml`文件的配置,包括Action的配置、拦截器栈的定义等。 2. **拦截器的编写和使用**:创建自定义拦截器类,实现`Interceptor`接口,以及如何在配置文件中引用拦截器。 3. **Action...
- XML配置:在`struts.xml`文件中,使用`<interceptor>`元素定义拦截器,`<interceptor-stack>`元素组合多个拦截器,`<package>`元素下的`interceptors`属性指定拦截器栈。 ```xml <!-- 可以添加其他内置或...
2. **配置拦截器**:在`struts.xml`配置文件中定义拦截器,指定其执行顺序和关联的Action。 3. **注册拦截器**:将自定义拦截器加入到`struts-default`或`struts-plugin`拦截器栈中,或者创建新的拦截器栈并应用到...
首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...
通过在`struts.xml`或`struts-plugin.xml`配置文件中定义拦截器栈,可以指定拦截器的执行顺序。 以下是一些常见的Struts2内置拦截器及其用途: 1. `params`:负责从请求参数中填充Action属性。 2. `i18n`:处理国际...
在`struts.xml`配置文件中,可以通过`<interceptors>`标签定义拦截器栈,并通过`<interceptor>`标签定义单个拦截器。使用`<interceptor-stack>`标签可以组合多个拦截器形成拦截器栈。通过`<package>`标签的`default-...
在`struts.xml`文件中定义拦截器的基本语法如下: ```xml 拦截器名" class="拦截器实现类"/> ``` 如果需要向拦截器传递参数,可以使用`<param>`标签: ```xml 拦截器名" class="拦截器实现类"> 参数名">参数值 ...
开发者可以通过配置struts.xml或struts.properties文件来定义拦截器链和其顺序。 1. **创建拦截器** 在Struts2中,我们可以通过实现`com.opensymphony.xwork2.interceptor.Interceptor`接口或者继承`...
在Struts2的核心配置文件`struts.xml`中,我们可以定义拦截器链,指定哪些拦截器应用于哪些Action。 权限控制是web应用中不可或缺的一部分,它可以防止未经授权的用户访问特定资源。在Struts2中,我们可以通过拦截...
当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...
在struts.xml配置文件中,你可以通过`<interceptors>`标签定义拦截器栈,并通过`<action>`标签中的`interceptor-ref`指定使用哪些拦截器。 然后,我们关注的是**校验(Validation)**。Struts2提供了基于注解和XML...
1. **定义拦截器类**:首先,我们需要创建一个实现了`Interceptor`接口的Java类。例如,我们可以创建一个名为`LoginCheckInterceptor`的类,并重写`intercept`方法。 ```java public class LoginCheckInterceptor ...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
在Struts2中,拦截器是基于Java的动态代理机制实现的,它们按照预定义的顺序形成一个拦截器链。当请求到达Action时,这些拦截器会按照顺序逐个执行其`intercept()`方法,最后调用实际的动作方法。拦截器可以独立于...
2. **配置拦截器**:在`struts.xml`配置文件中,你需要定义拦截器,并指定其在拦截器栈中的位置。可以使用`<interceptors>`标签定义拦截器栈,`<interceptor>`标签定义单个拦截器,`<interceptor-ref>`标签引用已...
3. **定义拦截器栈**:你可以将多个拦截器组合成一个拦截器栈,这样它们会按照声明的顺序依次执行。 4. **应用拦截器**:将拦截器栈与特定的Action关联,这样当Action被调用时,拦截器就会按顺序执行。 在提供的...
开发者可以通过实现这个接口或者继承已有的拦截器基类(如`AbstractInterceptor`)来自定义拦截器。 总的来说,Struts2拦截器提供了一种强大的机制,使得开发者可以轻松地扩展和控制应用程序的行为,而不需要修改...