14. 在springboot 中使用 过滤器Filter

zhanglei 2022年06月20日 286次浏览

14.1 使用 Filter

1.创建过滤器类,继承 Filter 接口
2. 配置过滤器类,让框架能识别

项目结构如下:

image-20220620084108582

14.1.1 创建过滤器类

package com.zhanglei.web;
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行了MyFilter,doFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

14.1.2 配置过滤器

运用 FilterRegistrationBean 类得到过滤器,FilterRegistrationBean 类:

image-20220619213955880

因此可以用 setFilter() 方法获取一个过滤器对象。那么如何设置 过滤的 url 呢,点进这个类的父类,找到方法:

image-20220619214146826

因此可以配置 过滤器:

package com.zhanglei.config;
import com.zhanglei.web.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    @Bean
    public FilterRegistrationBean getFilter(){

        FilterRegistrationBean bean= new FilterRegistrationBean();

        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/zhanglei/*");

        return bean;
    }
}

由于过滤器不是 框架 中的对象,不在容器中,因此要加 @bean 注解,将过滤器对象放到容器中

而 拦截器是 框架中的,本身就在容器中,因此不需要 @Bean

14.1.3 通过控制器验证 Filter

controller类:

package com.zhanglei.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {
    @RequestMapping("/zhanglei/login")
    @ResponseBody
    public String controller1(){
        return "/zhanglei/login";
    }

    @RequestMapping("/lutingting/login")
    @ResponseBody
    public String controller2(){
        return "/lutingting/login";
    }
}

​ 启动应用,在浏览器输入:localhost:8080/zhanglei/login,结果如下

image-20220619215617821

​ 由于该 url 经过了过滤器,因此控制台会有输出:

image-20220619215848355

我们在配置中,配置了过滤的 url 是:/zhanglei/*,因此当url 为/lutingting/login 时,不会经过过滤器。