博主声明:
本文由博主luoru_LR原创,请多支持与指教。
转载请在开头附加本文链接及作者信息,并标记为转载。
博主主页
过滤器简介
过滤器(Filter)也被称为拦截器,是Servlet中非常实用的技术,Web开发人员通过Filter技术,可以在用户访问某个Web资源(如JSP、Servlet、HTML、图片和CSS等)之前,对访问的请求和响应进行拦截,从而实现一些特殊的功能。例如:验证用户访问权限、记录用户操作、对请求进行重新编码和压缩响应信息等。
过滤器的运行原理是:当用户的请求到达所请求的资源之前,可以借助过滤器来改变这些请求的内容,此过程也称为“预处理”;当执行结果要响应到用户之前,可经过过滤器修改响应输出的内容,此过程也称为“后处理”。一个过滤器运行过程可以分解为一下几个步骤:
- Web容器判断接收的请求资源是否有与之匹配的过滤器,如果有,容器将请求交给相应过滤器处理;
- 在处理器预处理过程中,可以改变请求的内容,或者重新设置请求的报头信息,然后根据业务需求对请求进行拦截返回或者将请求发给目标资源;
- 如请求被转发给目标资源,则由目标资源对请求进行处理后做出响应;
- 容器将响应转发回过滤器;
- 在过滤器后处理过程中,可以根据需求对响应的内容进行修改;
- Web容器将响应发送回客户端;
过滤器的核心接口
过滤器的实现主要依靠以下核心接口:
- javax.servlet.Filter接口
- javax.servlet.FilterConfig接口
- javax.servlet.FilterChain接口
Filter接口
开发Filter必须实现javax.servlet.Filter接口,并提供一个公共的不带参数的构造方法。其中Filter接口定义了3个方法:
方法 | 说明 |
---|---|
init(FilterConfig config) | 过滤器初始化方法。容器在过滤器实例化或调用此方法对过滤器进行初始化,同时向其传递FilterConfig对象,用于获得和Servlet相关的ServletContext对象。 |
doFilter(ServletResquest request,ServletResponse response,FilterChain chain) | 过滤器的功能实现方法。当用户请求经过时,容器调用此方法对请求和响应进行功能处理。该方法由容器传入3个阐述对象,分别用于获取请求对象、响应对象和FilterChain对象,请求和响应对象分别为S而vletRequest和ServletResponse,并不依赖于具体的协议,FilterChain对象的doFIlter(request,reponse)方法负责将请求传递给下一个过滤器或目标资源。 |
destroy() | 该方法在过滤器生命周期结束前由Web应用调用,可用于使用资源的释放 |
FilterConfig接口
FilterConfig接口由容器实现,容器将其实例作为参数传入过滤器(Filter)对象的初始化方法中init()中,来获取过滤器的初始化参数和Servlet的相关信息。FilterConfig接口的具体方法如下:
方法 | 说明 |
---|---|
getFilterName() | 获取配置信息中指定的过滤器的名称 |
getinitParameter(String name) | 获取配置信息中指定的名为name的过滤器初始化参数值 |
getInitParameterNames() | 获取过滤器的所有初始化参数的名字的枚举集合 |
getServletContext() | 获取Servlet上下文对象 |
FilterChain接口
FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后的一个过滤器,那么将调用目标资源。
FilterChain接口只有一个方法,如下:
方法 | 说明 |
---|---|
doFilter(ServletRequest request,ServletResponse response) | 该方法将使过滤器链中的下一个过滤器被调用,如果该过滤器是链中最后的一个过滤器,那么将调用目标资源。 |
过滤器开发
基于上述过滤器的核心接口,一个过滤器的开发可以经过一下三个步骤:
- 创建Filter接口实现类
- 编写过滤器的功能实现代码
- 对过滤器进行声明和配置
Filter基本代码结构:
package com.luoru.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//此配置表示在浏览器请求FilterDemo01.jsp时使用此过滤器进行过滤拦截
@WebFilter("/FilterDemo01.jsp")
public class FilterDemo01 implements Filter {
/**
* 空的构造器方法(可不写)
*/
public FilterDemo01(){
}
/**
* 过滤器初始化方法
*/
@Override
public void init(FilterConfig filterConfig){
System.out.println("执行init()方法!");
}
/**
* 过滤器执行过滤功能的方法
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行doFilter方法----请求资源");
//使过滤器进行下一目标资源的调用,可理解为“放行”
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("执行doFilter方法----响应资源");
}
/**
* 过滤器生命周期结束前执行的资源释放方法
*/
@Override
public void destroy() {
System.out.println("执行destroy()方法!");
}
}