本文共 3919 字,大约阅读时间需要 13 分钟。
在Springboot项目中,常用的自定义过滤器的方式有两种:
@WebFilter
和FilterRegistrationBean
,下面通过案列分别使用两种方式来实现自定义Filter。
一、@WebFilter
此注解常用的属性有以下三种:
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定该filter的名称 |
urlPatterns | String | 指定该filter所拦截的url |
value | String | 与urlPatterns一致 |
@WebFilter
的方式可以通过控制过滤器命名的先后顺序来控制多个过滤器之间的顺序执行,例如:filterName="a"
会比filterName="b"
的过滤器先执行。
新建一个Springboot项目,新建一个Filter包,创建一个类MyFilter
package org.magic.springbootLogin.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;/** * @author: magic * @date: 2021/4/14 * @description: 写一个自己的过滤器 * @WebFilter:用于将一个类声明为Filter, * filterName:String 指定该Filter的名称 * urlPatterns:String 指定该Filter所拦截的Url * value:String 与urlPatterns一致 */@WebFilter(urlPatterns = "/userController/*",filterName = "myFilter")public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFilter被初始化了"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req= (HttpServletRequest) request; System.out.println(req.getRequestURI()); System.out.println(req.getMethod()); System.out.println("执行了MyFilter"); filterChain.doFilter(request, response); } @Override public void destroy() { System.out.println("MyFilter被销毁了"); }}
然后在项目的启动类上添加注解@ServletComponentScan
,
MyFilter被初始化了
然后再通过前端发送一个请求(前提是请求的路径必须是在Filter中被声明了的,案例中是userController下的所有接口都会被拦截
) 发现在请求的过程中,执行了doFilter方法
,我们可以直接在doFilter
中写自己的拦截逻辑就行了。 二、FilterRegistrationBean
此种方式就是通过向容器中注入自定义Bean
对象来实现自定义过滤器
还是新建一个springboot
项目,新建一个MyFilter
,
package org.magic.springbootLogin.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;/** * @author: magic * @date: 2021/4/14 * @description: 写一个自己的过滤器 */public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFilter被初始化了"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req= (HttpServletRequest) request; System.out.println(req.getRequestURI()); System.out.println(req.getMethod()); System.out.println("执行了MyFilter"); filterChain.doFilter(request, response); } @Override public void destroy() { System.out.println("MyFilter被销毁了"); }}
新建一个config
包,在里面新建一个FilterConfig
:
package org.magic.springbootLogin.config;import java.util.Collection;import javax.servlet.Filter;import org.magic.springbootLogin.filter.MyFilter;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author: magic * @date: 2021/4/14 * @description: */@Configurationpublic class FilterConfig { @Bean public MyFilter getMyFilter() { return new MyFilter(); } @Bean public FilterRegistrationBeangetFilterRegistrationBean(MyFilter myFilter) { FilterRegistrationBean filter = new FilterRegistrationBean<>(); filter.setFilter(myFilter); filter.addUrlPatterns("/userController/*"); filter.setName("myFilter"); filter.setOrder(1); return filter; }}
!!!
使用此种方式实现自定义过滤器,不需要在启动类上添加注解:@ServletComponentScan
, 启动项目,发现过滤器也被初始化了:
转载地址:http://kvhwi.baihongyu.com/