SpringBoot中实现拦截器和过滤器

1.过滤器和拦截器简述

过滤器Filter和拦截器Interceptor, 在功能方面很类似, 但在具体实现方面差距还是比较大。

  • 1.1 运行顺序不同:FilterServletInterceptorController
  • 1.2 配置方式不同:Filterweb.xml中进行配置,InterceptorSpring的配置文件中进行配置(或注解);
  • 1.3 依赖环境不同:Filter依赖于Servlet容器,而Interceptor不依赖Servlet容器;
  • 1.4 操作对象不同:Filter只能对requestresponse进行操作,而Interceptor可对requestresponsehandlermodelAndViewexception进行操作(对Spring MVC生态下组件的操作能力)。

2.过滤器的配置

  • 2.1 自定义过滤器,实现Filter接口(Springboot3开始,jakarta.servlet.Filter)
java 复制代码
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
   
}
  • 2.2 重写doFilter,实现过滤逻辑,酌情放行
java 复制代码
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;

/**
 * 自定义过滤器:实现根据IP统计访问次数
 */
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 获取访问的IP
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String ip = request.getRemoteAddr();
        // 统计访问次数并输出
        HttpSession session = request.getSession();
        Integer count = (Integer) session.getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        System.out.println("ip:" + ip + "\tcount:" + count);
        session.setAttribute("count", count);
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
  • 2.3 添加@WebFilter@ServletComponentScan注解,实现过滤的范围配置
java 复制代码
import javax.servlet.annotation.WebFilter;

/**
 * 自定义过滤器:实现根据IP统计访问次数
 */
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.neusoft.springboot.filter")
public class Application {

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

3.拦截器的配置

  • 3.1 自定义拦截器,实现HandlerInterceptor接口
java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor implements HandlerInterceptor {

}
  • 3.2 实现接口中的拦截方法(preHandle-请求执行前、postHandler-请求执行后、afterCompletion-视图渲染后)
java 复制代码
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Objects;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 记录访问IP的次数逻辑
        // 获取访问的IP
        String ip = request.getRemoteAddr();
        // 统计访问次数并输出
        HttpSession session = request.getSession();
        Integer count = (Integer) session.getAttribute("count");
        count = Objects.isNull(count) ? 1 : ++count;
        System.out.println("ip:" + ip + "\tcount:" + count);
        session.setAttribute("count", count);
        // 放行
        return true;
    }
}
  • 3.3 创建配置类,实现WebMvcConfigurer接口,重写addInterceptors方法
java 复制代码
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

public class InterceptorConfiguration implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();
        registry.addInterceptor(myInterceptor).addPathPatterns("/*");
    }
}

4.总结

  • 4.1 Filter依赖于Servlet容器,属于Servlet规范的一部分,而Interceptor依赖于SpringMVC框架;
  • 4.2 Filter的生命周期由Servlet容器管理,而Interceptor通过IOC容器来管理,可通过注入等方式来获取其Bean的实例;
  • 4.3 Filter可拦截所有Web资源(包括jsp,servlet,静态资源),而Interceptor则只拦截Controller。
相关推荐
东风破_19 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※19 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
卷无止境19 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
白狐_79820 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25820 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅21 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
卷无止境21 小时前
FastAPI 的Admin面板生态
后端·python
捡田螺的小男孩1 天前
什么是 Skill?手把手带你写一个简单有用的 Skill!
前端·后端·程序员
IT_陈寒1 天前
Redis集群这个坑,差点让我通宵
前端·人工智能·后端
极创信息1 天前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate