2024年4月19日发(作者:)

过滤器

创建一个Filter 只需两个步骤:

(1)创建Filter 处理类:

(2)在 文件中配置Filter 。

创建Filter 必须实现 接口,在该接口中定义了三个方法。

• void init(FilterConfig config): 用于完成Filter 的初始化。

• void destroy(): 用于Filter 销毁前,完成某些资源的回收。

• void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实

现过滤功能,该方法就是对每个请求及响应增加的额外处理。

过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。

在servlet2.4中,过滤器同样可以用于请求分派器,但须在中声明,

INCLUDE或FORWARD或REQUEST或ERROR该元素位于

filter-mapping中。

一、理解Struts2拦截器

1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,

并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一

条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺

序被调用。

二、实现Struts2拦截器原理

Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,

并根据其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列表

中的拦截器

三、定义Struts2拦截器。

Struts2规定用户自定义拦截器必须实现

eptor接口。该接口声明了3个方法,

void init();

void destroy();

String intercept(ActionInvocation invocation)

throws Exception;

其中,init和destroy方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否,

只要在中声明了该Struts2拦截器就会被执行。

intercept方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。

不过,struts中又提供了几个抽象类来简化这一步骤。

public abstract class AbstractInterceptor

implements Interceptor;

public abstract class MethodFilterInterceptor

extends AbstractInterceptor;

都是模板方法实现的。

其中AbstractInterceptor提供了init()和destroy()的空实现,使用时只需要覆盖intercept()

方法;

而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来

过滤执行该过滤器的action的方法。可以通过param来加入或者排除需要过滤的方法。

一般来说,拦截器的写法都差不多。看下面的示例:

package interceptor;

import Invocation;

import

eptor;

public class MyInterceptor implements Interceptor {

public void destroy() {

// TODO Auto-generated method stub

}

public void init() {

// TODO Auto-generated method stub

}

public String intercept(ActionInvocation

invocation) throws Exception {

n("Action执行前插入 代码");

//执行目标方法 (调用下一个拦截器, 或执行

Action)