Java学习之Filter

来源:互联网 发布:淘宝双收藏是什么意思 编辑:程序博客网 时间:2024/05/22 05:07

作者通过阅读相关技术文档以及于其它大神一起探讨,略有感悟,故写这一文章。

1. Filter简介:

In signal processing, a filter is a device or process that removes some unwanted components or features from a signal. Filtering is a class of signal processing, the defining feature of filters being the complete or partial suppression of some aspect of the signal. Most often, this means removing some frequencies and not others in order to suppress interfering signals and reduce background noise. However, filters do not exclusively act in the frequency domain; especially in the field of image processing many other targets for filtering exist. Correlations can be removed for certain frequency components and not for others without having to act in the frequency domain.

(Filter就是一个过滤器,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

即: 用户请求---->Filter----->后台响应----->Filter----->返回前端

2. Filter 实现功能

init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数。

doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。

destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。

3.web.xml配置

<!-- 编码过滤器 -->      <filter>          <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空</filter-name>          <filter-class>元素用于指定过滤器的完整的限定类名</filter-class>          <init-param>              <param-name>指定参数的名字</param-name>              <param-value>指定参数的值</param-value>          </init-param>      </filter>      <filter-mapping>          <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字</filter-name>          <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)</url-pattern>      </filter-mapping>  <servlet-name>指定过滤器所拦截的Servlet名称。<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。<dispatcher>子元素可以设置的值及其意义REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

4. 代码案例
<!-- 编码过滤器 -->      <filter>          <filter-name>setCharacterEncoding</filter-name>          <filter-class>com.liu.filter.Utf8Filter.java</filter-class>          <init-param>              <param-name>encoding</param-name>              <param-value>utf-8</param-value>          </init-param>      </filter>      <filter-mapping>          <filter-name>setCharacterEncoding</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>  
package com.liu.filter;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;import javax.servlet.annotation.WebFilter;/** * Servlet Filter implementation class Utf8Filter */@WebFilter("/*")public class Utf8Filter implements Filter {    /**     * Default constructor.      */    public Utf8Filter() {        // TODO Auto-generated constructor stub    }private String encoding;      private Map<String, String> params = new HashMap<String, String>();      // 项目结束时就已经进行销毁      public void destroy() {         params=null;          encoding=null;      }  /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(encoding);chain.doFilter(request, response);}/** * @see Filter#init(FilterConfig) */public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stubencoding = fConfig.getInitParameter("encoding"); }}


5.引用

借鉴地址1借鉴地址2