SpringBoot中使用Filter(过滤器)

目录

1. 入门

1.1 编写实体类

1.2 编写过滤器

1.3 编写Controller

1.4 在启动类上开启servlet组件扫描(@ServletComponentScan)

1.5 测试并观察控制台打印情况

2. 进阶

2.1 过滤器简单介绍

2.2 编写过滤器类

2.3?编写过滤器配置类

2.4?Controller和实体类和之前一样,启动类的servlet组件扫描可去除

2.5?启动程序并观察控制台


1. 入门
1.1 编写实体类
@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
    private Date date;
    private String msg ;
    private String title;
}
1.2 编写过滤器
@WebFilter(urlPatterns = "/message/*",filterName = "filter1")
public class MessageFilter1 extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        if("/message/echo".equals(request.getRequestURI())) {
            String title = request.getParameter("title");
            System.out.println("【filter1】拦截到的请求的title参数内容为:"+title);
        }
//        将请求传递给链中的下一个过滤器或目标Servlet
        chain.doFilter(request,response);
    }
}
1.3 编写Controller
@RestController
@RequestMapping("/message")
public class MessageController {
    @Resource
    private Message message ;
    @RequestMapping("/echo")
    public Message echo(String msg,String title) {
        message.setTitle(title);
        message.setMsg(msg);
        return message;
    }

}
1.4 在启动类上开启servlet组件扫描(@ServletComponentScan)
@SpringBootApplication
@ServletComponentScan   //开启servlet组件扫描
public class MicrobootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicrobootWebApplication.class, args);
    }

}
1.5 测试并观察控制台打印情况
http://localhost:8083/message/echo?msg=西红柿战争&title=两败俱伤

拦截成功

2. 进阶
2.1 过滤器简单介绍

过滤器(Filter)是Java Web应用中一种用于处理请求(request)和响应(response)的组件

过滤器和拦截器的执行顺序:

  • 过滤器(预处理)
  • 过滤器(后处理)
  • 拦截器(前处理)
  • 控制器方法(Controller)
  • 拦截器(后处理)
  • 过滤器(后处理)
2.2 编写过滤器类
//过滤器1,因为有了配置类,不再需要添加@WebFilter注解
public class MessageFilter1 extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        if("/message/echo".equals(request.getRequestURI())) {
            String title = request.getParameter("title");
            System.out.println("【filter1】拦截到的请求的title参数内容为:"+title);
        }
        chain.doFilter(request,response);
    }
}

public class MessageFilter2 extends HttpFilter {
    @Override
    protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        if("/message/echo".equals(request.getRequestURI())) {
            String msg = request.getParameter("msg");
            System.out.println("【filter2】拦截到的请求的title参数内容为:"+msg);
        }
        chain.doFilter(request,response);
    }
}
2.3编写过滤器配置类
//过滤器配置类
@Configuration
public class WebFilterConfig {

    @Bean
    public FilterRegistrationBean getFilter1Registration() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(this.getMessageFilter1());
        //设置过滤器名称和路径,在过滤器类写了的话,这里不用重复写
        filterRegistrationBean.setName("filter");
        filterRegistrationBean.addUrlPatterns("/*");
        //设置过滤器执行顺序,数字越小,越早进行过滤,也可设置为负数
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean getFilter2Registration() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(this.getMessageFilter2());
        //设置过滤器执行顺序
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }

    @Bean
    public MessageFilter1 getMessageFilter1() {
        return new MessageFilter1();
    }

    @Bean
    public MessageFilter2 getMessageFilter2() {
        return new MessageFilter2();
    }
}
2.4Controller和实体类和之前一样,启动类的servlet组件扫描可去除
//@ServletComponentScan   //开启servlet组件扫描
public class MicrobootWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicrobootWebApplication.class, args);
    }

}
2.5启动程序并观察控制台
http://localhost:8083/message/echo?msg=西红柿战争&title=两败俱伤

filter1比filter2先启用,执行成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值