Filter是Servlet的过滤器,是Servlet 2.3规范中新增加的一个功能,主要用于完成一些通用的操作,如编码的过滤、判断用户的登录状态等。例如生活中人们使用污水净化设备对水源进行过滤一样,在Java Web程序中通过使用Filter对发送至服务器的请求和响应信息进行过滤。 Filter之所以被称为过滤器,其主要作用是对Servlet容器调用的过程进行“拦截”,从而在Servlet进行响应处理前后实现一些特殊功能。Filter在Web应用中的拦截过程如图: 在图中,当用户通过浏览器访问服务器中的目标资源时,首先会被Filter拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器处理对这个请求的响应的时候,也需要将响应结果经过滤器处理后,才发送给客户端。 本质上,Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了三个方法:
init(FilterConfig filterConfig):init() 方法用于初始化过滤器,开发人员可以在 init() 方法中完成与构造方法类似的初始化功能,如果初始化代码中要使用到 FillerConfig 对象,那么,这些初始化代码就只能在 Filler 的 init() 方法中编写,而不能在构造方法中编写doFilter(ServletRequest request,SeivletResponse response, FilterChain chain):doFilter() 方法有多个参数,其中,参数 request 和 response 为 Web 服务器或 Filter 链中的上一个 Filter 传递过来的请求和响应对象;参数 chain 代表当前 Filter 链的对象,只有在当前 Filter 对象中的 doFilter() 方法内部需要调用 FilterChain 对象的 doFilter() 方法,才能把请求交付给 Filter 链中的下一个 Filter 或者目标程序处理destroy():destroy() 方法在 Web 服务器卸载 Filter 对象之前被调用,该方法用于释放被 Filter 对象打开的资源,例如关闭数据库和 I/O 流上述三个方法都是可以表现 Filter 生命周期的方法,其中 init() 方法在 Web 应用程序加载时会被调用,destroy() 方法在 Web 应用程序卸载(或关闭)时被调用,这两个方法都只会被调用一次,而 doFilter() 方法会被调用多次(只要客户端有请求时就会被调用),Filter 所有的工作集中在 doFilter() 方法中。(Filter与Servlet一样都需要在web.xml中配置)
比如一个用户登录项目中,输入用户名时可能会包含中文,服务器端处理时会出现乱码情况,使用Filter技术既可以解决问题。 GenericEncodingFilter .java
//过滤器类 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class GenericEncodingFilter implements Filter { //继承Filter类 //字符编码 String encoding=null; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(encoding!=null){ //设置request字符编码 request.setCharacterEncoding(encoding); //设置response字符编码 response.setContentType("text/html;charset="+encoding); } //传递给下一个过滤器 chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { //获取初始化参数 encoding=filterConfig.getInitParameter("encoding"); } public void destroy() { // TODO Auto-generated method stub encoding=null; } }web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>GenericEncoding</filter-name> <filter-class>Filter.GenericEncodingFilter</filter-class> <init-param> <!--初始化参数--> <param-name>encoding</param-name> <!--参数名称--> <param-value>utf-8</param-value> <!--参数值--> </init-param> </filter> <filter-mapping> <filter-name>GenericEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>