简介
SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。
使用场景
SpringBoot过滤器的应用场景:
- 过滤敏感词汇,防止SQL注入
- 设置字符编码
- URL级别的权限访问控制
创建SpringBoot过滤器主要有两种方式,分别:1、实现Filter接口+向spring容器注册filter,2、实现Filter接口+@WebFilter注解
1、Filter接口+向spring容器注册filter
Filter过滤器具体实现类
新建一个AuthFilter过滤器实现类,该类需要实现Filter类,如下:
@Component
public class AuthFilter implements Filter {
/**
* 过滤白名单
*/
private static List<String> WHITE_URL = new ArrayList<>();
static {
WHITE_URL.add("/auth");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("创建AuthFilter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行AuthFilter");
HttpServletRequest request = (HttpServletRequest) servletRequest;
if(WHITE_URL.contains(request.getRequestURI())){
System.out.println("这是请求白名单,直接放行....");
filterChain.doFilter(servletRequest, servletResponse);
return;
}
System.out.println("无登录态,跳转到Auth页面。。。");
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 路由跳转
request.getRequestDispatcher("/auth/unauth").forward(request, response);
}
@Override
public void destroy() {
System.out.println("销毁AuthFilter");
}
}
向Spring容器中注册Filter
@Configuration
public class FilterConfig {
@Resource
private AuthFilter authFilter;
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(authFilter);
registrationBean.addUrlPatterns("/*"); //需要过滤的URI
registrationBean.setName("authFilter");
registrationBean.setOrder(1);
return registrationBean;
}
}
2、Filter接口+@WebFilter
Filter过滤器具体实现类
新建一个AuthFilter过滤器实现类,该类需要实现Filter类,并同时在AuthFilter类上标注@WebFilter
注解,如下:
@WebFilter(urlPatterns = "/auth/*", filterName = "authFilter") //需要过滤的URI
public class AuthFilter implements Filter {
/**
* 过滤白名单
*/
private static List<String> WHITE_URL = new ArrayList<>();
static {
WHITE_URL.add("/auth");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("创建AuthFilter");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行AuthFilter");
HttpServletRequest request = (HttpServletRequest) servletRequest;
if(WHITE_URL.contains(request.getRequestURI())){
System.out.println("这是请求白名单,直接放行....");
filterChain.doFilter(servletRequest, servletResponse);
return;
}
System.out.println("无登录态,跳转到Auth页面。。。");
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 路由跳转
request.getRequestDispatcher("/auth/unauth").forward(request, response);
}
@Override
public void destroy() {
System.out.println("销毁AuthFilter");
}
}
添加@ServletComponentScan
注解
需要在启动类中添加@ServletComponentScan
注解,如下:
@ServletComponentScan
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
过滤器与拦截器区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
6、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用。而过滤器只需依赖servlet api,不需要依赖spring。
何时使用拦截器?何时使用过滤器
- 如果是非spring项目,那么拦截器则不可使用,只能使用过滤器
- 如果是处理controller前后,则既可以使用拦截器也可以使用过滤器
- 如果是处理dipaterServlet前后,则只可以使用过滤器,像中文乱码问题通常都是使用过滤器实现的
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/619