Filter过滤器入门

Posted 好多个码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Filter过滤器入门相关的知识,希望对你有一定的参考价值。

第一章 过滤器简介

1.1 过滤器是什么

​ 简而言之,是在servlet之前执行,拦截请求,将servlet中一些共同的业务代码抽取出来,这就是过滤器作用。比如:请求乱码处理。

过滤器开发入门

1、过滤器API介绍

Filter是由Tomcat启动时创建,是javax.servlet包下面的一个接口,这个接口中定义了3个方法。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package javax.servlet;

import java.io.IOException;

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}
方法说明
void init(FilterConfig filterConfig)过滤器对象创建的时候调用的方法
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)执行过滤的方法
void destory()过滤器销毁的时候调用的方法

Filter配置

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebFilter("/${Entity_Name}")
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${Class_Name} implements javax.servlet.Filter {
    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        //your  code....
        
        chain.doFilter(request, response);
    }

    @Override
    public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {

    }

}
  • 项目中如果需要使用到过滤器,使用Servlet3.0的注解方式进行创建。创建步骤如下:

  • 第一步:新建一个普通java类,实现Filter接口;

  • 第二步:根据提示重写Filter接口的3个方法;

  • 第三步:在这个类上面通过注解的方式配置这个Filter;

    • 注解@WebFilter:配置Filter的注解,这个注解有两个参数;

      • filterName:设置过滤器的名称;

      • urlPatterns:配置这个过滤器要拦截的资源的路径;

  • 第四步:在doFilter()方法中,书写过滤的业务逻辑;

    • chain.doFilter()方法放行;

总结:

doFilter()方法的作用

当不写doFilter()方法时候,jsp文件访问不到,被拦截;

当有了doFilter()方法时候,jsp文件可以访问,被放行;所以:doFilter()具有放行的作用。

Filter的生命周期

​ 上面,我们分析了Filter的执行流程。我们有没有想过,我们并没有向Filter发送请求,请求是怎么进入到doFilter()中的呢。我们知道,能够调用一个类下面的非静态的成员方法,一定是这个类的对象。Filter类的对象是在什么时候创建的呢?创建之后又是怎么工作的呢?最后是在什么时候销毁的呢?这些问题就是Filter的生命周期问题。我们,可以通过以下代码对Filter的生命周期问题进行验证:

【结论】

  1. Filter类的对象是在服务器启动的时候创建的;

  2. Filter类对象创建完成后会调用init()方法;

  3. 每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法 (类似于service方法)

  4. 当服务器停止的时候,销毁过滤器,执行过滤器的destory方法

1、doFilter()方法

​ doFilter()方法是拦截请求的方法,只要一个请求符合Filter拦截路径,都会被doFilter()方法拦截。doFilter()方法有3个参数,这3个参数的作用分别如下:

参数说明
ServletRequest reqServletRequest是HttpServletRequest类的父类,其中包含了被拦截的请求的信息
ServletResponse respServletResponse是HttpServletResponse类的父类,其中包含了被拦截的响应的信息
FilterChain chainFilterChain给Filter提供了放行的方法。chain.doFilter();

FilterChain 类是一个接口,里面有doFilter(req,resp)方法,作用是将浏览器提交请求对象和响应对象传到过滤连的资源里面去,所以doFilter()方法具有放行的作用。

 

2、destory()方法

​ 过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。

【结论】

  1. 过滤器是在服务器停止或者项目移除时销毁的;

  2. 过滤器销毁后会调用destory()方法;

【小结】Filter生命周期小结

  1. 当服务器启动的时候,过滤器就被初始化了,执行过滤器的init方法

  2. 每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法

  3. 当服务器停止的时候,销毁过滤器,执行过滤器的destory方法

 

 

 

 

以上是关于Filter过滤器入门的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net MVC3 简单入门详解过滤器Filter

狂神说JavaJavaWeb入门到实战--Filter 过滤器

zuul入门zuul的过滤器加载

Vue入门过滤器filter

Filter-入门

D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器