本文介绍Servlet中的doFilter方法,以及介绍过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。
编写实现类的程序
过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、Filter Chain 和 Filter Config。从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 Filter Chain 和 Filter Config 接口。该过滤器类的一个引用将传递给 Filter Chain 对象,以允许过滤器把控制权传递给链中的下一个资源。Filter Config 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。
为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:
init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 Filter Config 类型的对象作为输入。
doFilter ():与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter方法。这个方法接受三个输入参数:一个 Servlet Request、response 和一个 Filter Chain 对象。
destroy():正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。
清单 1 展示了一个非常简单的过滤器,它跟踪满足一个客户机的 Web 请求所花的大致时间。
清单 1. 一个过滤器类实现
import javax.servlet.*;
import java.util.*;
import java.io.*;
public class TimeTrackFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter( ServletRequest request, ServletResponse response,
FilterChain chain ) throws IOException, ServletException {
Date startTime, endTime;
double totalTime;
startTime = new Date(); // Forward the request to the next resource in
the chain chain.doFilter(request, wrapper);
// -- Process the response -- \\
// Calculate the difference between the start time and end time
endTime = new Date();
totalTime = endTime.getTime() - startTime.getTime();
totalTimetotalTime = totalTime / 1000; //Convert from milliseconds to
seconds StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
writer.println();
writer.println("===============");
writer.println("Total elapsed time is: " + totalTime + " seconds." );
writer.println("==============="); // Log the resulting string writer.flush();
filterConfig.getServletContext(). log(sw.getBuffer().toString());
}
}
这个过滤器的生命周期很简单,不管怎样,我们还是研究一下它吧:
初始化
当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。
过滤
过滤器的大多数时间都消耗在这里。doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。
析构
容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。[size=large][/size]
分享到:
相关推荐
在doFilter()方法中,通过调用FilterChain的doFilter()方法,继续执行下一个Filter或传递请求给Servlet。 6. **web.xml配置示例** - 例子中设置了两个Filter:一个用于设置字符编码(setCharacterEncoding),另一...
在Java Web开发中,`doFilter`方法是Servlet过滤器的核心,它负责处理所有通过过滤器的请求和响应。过滤器(Filter)是Java Servlet技术中的一项重要功能,允许开发者在请求到达目标资源(如Servlet或JSP页面)之前...
Servlet过滤器,主要配置了中文乱码及未登陆验证过滤器。 代码简单明了,易学。 过滤器实现类 1、Filter接口:所有的... Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。
`doFilter()`方法是Filter的核心,用于拦截请求和响应。 8. **监听器Listener**:Servlet API提供了一系列的事件监听器接口,如`ServletRequestListener`,`SessionListener`等,它们可以在特定的Servlet事件(如...
它们通过`<filter>`和`<filter-mapping>`元素在`web.xml`中配置,并使用`doFilter()`方法执行过滤逻辑。 7. **监听器(Listener)**: 监听器是实现特定Servlet接口的类,可以监听Web应用中的各种事件,例如会话创建...
并覆盖doFilter方法,这个方法是Filter的核心,它接受ServletRequest和ServletResponse对象作为参数,以及FilterChain对象,通过调用FilterChain的doFilter方法来传递请求到下一个过滤器或目标Servlet。 在Filter的...
- **处理乱码**:在`doFilter`方法中,对请求和响应进行编码设置。 ```java chain.doFilter(request, new HttpServletResponseWrapper(response) { @Override public ServletOutputStream getOutputStream() ...
Servlet 的生命周期通过 javax.servlet.Servlet 接口中的 init()、service() 和 destroy() 方法来表示。 * 加载和实例化 * 初始化,调用 init() * 请求处理,调用 service() * 结束,销毁实例,调用 destroy() ...
`javax.servlet.Filter`接口定义了`doFilter()`方法,这使得我们可以实现如认证、日志记录、数据过滤等功能。 在描述中提到的`servlet-api.jar`文件是Servlet API的实现库,包含了所有Servlet API的类和接口。开发...
初始化参数可以在`web.xml`中通过`<init-param>`元素配置,它们会被传递给Servlet实例中的`init()`方法。这些参数通常用于配置Servlet的行为,例如设置数据库连接信息等。 ```xml <servlet> <servlet-name>...
自定义的Filter需要实现`javax.servlet.Filter`接口,并重写`doFilter`方法。在这个方法中,首先检查请求的编码,如果没有设定或者不是预期的编码(如UTF-8),则设定正确的编码。这样,无论请求是GET还是POST,...
通过`doFilter()`方法实现过滤逻辑,并在web.xml中配置过滤器链。 六、监听器(Listener) 监听器用于监听Servlet容器中的特定事件,如Session的创建、销毁,或者Context的初始化、销毁等。常见的监听器接口有`...
在部分内容中,解决servlet中文乱码问题1的方法可以分为两个方面: ① 在页面输入中文,请求页面后不出现乱码的方法是,确保contentType和pageEncoding保持一致为UTF-8,并且浏览器显示的字符编码也为UTF-8。这样...
在`doFilter()`方法中,如果没有匹配到预设的Servlet,`FilterChain`对象的`doFilter()`方法会被调用,这使得请求能按照过滤器链的顺序继续传递,直到到达最终的目标资源。 综上所述,Struts2提供了多种方式来与...
2. `doFilter(ServletRequest request, ServletResponse response, FilterChain chain)`:这是过滤器的主要工作方法。`request`和`response`对象分别代表了HTTP请求和响应,`chain`对象则代表了过滤链。在调用`chain...
doFilter 方法的参数包括 ServletRequest 对象、ServletResponse 对象和 FilterChain 对象。 * ServletRequest 对象提供了对进入的信息(包括表单数据、cookie 和 HTTP 请求头)的完全访问。 * ServletResponse ...
10. **FilterChain接口**:在过滤器链中,代表后续过滤器和最终的目标Servlet,调用`doFilter()`方法可以按顺序执行过滤器链。 11. **FilterConfig接口**:类似于ServletConfig,提供了过滤器的配置信息。 通过...
- 通过实现`Filter`接口,定义`doFilter()`方法,并在`web.xml`中配置过滤规则。 8. **监听器(Listener)**: - 监听器可以监听Web应用程序中的特定事件,如会话创建、销毁等。 - 实现如`HttpSessionListener`...
2. 在`doFilter()`方法中,获取当前的计数值,如果不存在则初始化为0。 3. 增加计数值,然后将更新后的计数存储回去。 4. 通过`chain.doFilter(request, response);`将请求传递给下一个过滤器或目标Servlet,保证...