Filter过滤器

介绍

Filter: 过滤器, Servlet技术中最实用的技术, 可以通过Filter拦截器对Web服务器管理所有web资源, 对jsp html 图片等资源进行拦截.

作用

1, 可以在请求(HttpServletRequest)到达Servlet之前拦截请求, 检查和修改请求信息. 如: url权限访问控制, 过滤敏感词汇, 压缩请求信息等.

2, 可以在响应(HttpServletResponse)到达客户端之前拦截响应, 检查和修改响应信息.

接口方法介绍


package javax.servlet;

import java.io.IOException;

public interface Filter {

    /**
     * 初始化
     * web 服务启动时, 实例化Filter过滤器
     * 实例化过滤器后, servlet容器只调用一次init方法. 在过滤器被要求做任何过滤工作之前, init方法必须成功完成
     */
    public void init(FilterConfig filterConfig) throws ServletException;

    /**
     * 过滤器的直接操作方法, 请求被拦截后在 doFilter 中对请求进行操作
     * 处理结束后 使用 chain.doFilter(request, response) 放行, 将调用下一个过滤器或者请求的资源
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    /**
     * 由Web容器调用,以向过滤器指示它正在停止服务。
     * 只有在过滤器的过滤器方法中的所有线程已退出或经过超时时间后,才会调用此方法。 在Web容器调用此方法后,它不会再次在此过滤器实例上调用do Filter方法。
     * 此方法为过滤器提供了清理所有正在保存的资源(例如内存,文件句柄,线程)的机会,并确保任何持久状态都与内存中过滤器的当前状态同步
     */
    public void destroy();
}

init() 参数 FilterConfig 介绍

package javax.servlet;

import javax.servlet.ServletContext;
import java.util.Enumeration;

public interface FilterConfig {

    /**
     * 获取FilterName
     */
    public String getFilterName();

    /**
     * 获取Servlet上下文对象的引用
     */
    public ServletContext getServletContext();

    /**
     * 返回包含指定初始化参数值的String,如果初始化参数不存在,则返回 null
     * 即在web.xml中设置的 init-param 如:
     * <init-param>
     *     <param-name>forceEncoding</param-name>
     *     <param-value>true</param-value>
     * </init-param>
     */
    public String getInitParameter(String name);

    /**
     * 返回过滤器初始化参数的名称枚举集合
     */
    public Enumeration<String> getInitParameterNames();

}

使用流程

1.配置web.xml

    <!--自定义拦截器-->
    <filter>
        <filter-name>requestFilter</filter-name>
        <filter-class>com.liuzhihang.testproject.controller.filter.RequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>requestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.编写RequestFilter并实现Filter接口、子接口或继承其实现类

package com.liuzhihang.testproject.controller.filter;

import javax.servlet.*;
import java.io.IOException;

public class RequestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //相关处理逻辑, 后放行
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }
}

3.调用顺序

按照 filter 在 web.xml 的注册顺序 从上到下 依次执行, 直至目标资源.

Spring 字符编码过滤器

web请求时确保字符编码一致, 可以用来防止中文乱码.

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Filter 的注册和映射

1.注册 Filter

    <filter>
        <!-- filter描述 可以不配置 -->
        <description>description for RequestFilter</description>
        <filter-name>requestFilter</filter-name>
        <filter-class>com.liuzhihang.moneytree.controller.filter.RequestFilter</filter-class>
        <!--配置FilterTest过滤器的初始化参数-->
        <init-param>
            <description>description for param</description>
            <!-- 参数名称 -->
            <param-name>reqParam</param-name>
            <!-- 参数值 -->
            <param-value>reqValue</param-value>
        </init-param>
    </filter>

2.映射 Filter

filter 注册后, 需要进行映射, 声明过滤的请求

    <filter-mapping>
        <!-- 注册的filter, 与上面相同 -->
        <filter-name>requestFilter</filter-name>
        <!-- 拦截的请求 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

   转载规则


《Filter过滤器》 liuzhihang 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录