一、引言

 上一篇文章学习了java三大器的拦截器,拦截器主要是针对于action请求进行拦截处理的,那么对于requst的一些信息如果在调用前,想先进行过滤和处理,那么就要使用到第二个神器,也就是本文的主角过滤器~那首先先简单了解一下过滤器的基本原理。

概念:拦截request进行处理后再交给下一个过滤器或servlet处理的中间组件,也可以对返回的response进行拦截处理。

  作用域:在服务器启动时就会创建的,只会创建一个实例,常驻内存。

  应用场景:统一设置编码格式、访问权限控制、敏感字符过滤、自动登录等。

  下面通过代码来看下过滤器的几个应用场景~

二、代码实现

实现过滤器功能,我们得先进行一些前期的配置:

java拦截器统一异常处理 拦截器javaweb_字符编码

   按照上图配置好了以后,重启SpringBoot项目时,我们自定义的过滤器就能生效了

字符编码过滤器

/**
 * 字符编码过滤器
 * @Author 有梦想的肥宅
 */
@WebFilter(
        urlPatterns = "/*",/*通配符(*)表示对所有的web资源进行拦截*/
        initParams = {
                @WebInitParam(name = "filterName", value = "CharsetFilter"),
                @WebInitParam(name = "charset", value = "utf-8")
        })
@Order(1)//指定过滤器的执行顺序,值越大越靠后执行
public class CharsetFilter implements Filter {
    private String filterName;
    private String charset;

    /**
     * 初始化方法  接收一个FilterConfig类型的参数 该参数是对Filter的一些配置
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        filterName = config.getInitParameter("filterName");
        charset = config.getInitParameter("charset");
        System.out.println("过滤器名称:" + filterName);
        System.out.println("字符集编码:" + charset);

    }

    /**
     * 过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println(filterName + "doFilter()");
        req.setCharacterEncoding(charset);//设置请求request的字符编码
        resp.setCharacterEncoding(charset);//设置响应response的字符编码
        chain.doFilter(req, resp);
    }

    /**
     * 销毁时方法
     */
    @Override
    public void destroy() {
        System.out.println(filterName + "销毁");
    }

}

  源码贴上了,来简单解析一下:

java拦截器统一异常处理 拦截器javaweb_ide_02

 

java拦截器统一异常处理 拦截器javaweb_ide_03

java拦截器统一异常处理 拦截器javaweb_字符编码_04

   我们常用的过滤器配置有一下几种:

urlPatterns:配置要拦截的资源

  • 1、以指定资源匹配。例如"/login.html"
  • 2、以目录匹配。例如"/user/login/*"
  • 3、以后缀名匹配,例如"*.html"
  • 4、通配符,拦截所有web资源。"/*"

initParams:配置初始化参数

  • 使用@WebInitParam注解来配置,如:@WebInitParam(name = "charset", value = "utf-8")