Spring拦截器与Servlet过滤器区别

前言

温馨提醒:希望读者了解Spring拦截器和Servlet过滤器基础知识

目录

前言

位置和层面

使用场景

配置方式

生命周期

执行顺序

总结


Spring拦截器基础知识https://blog.csdn.net/Dreamkidya/article/details/141825688?spm=1001.2014.3001.5501

Servlet过滤器基础知识https://blog.csdn.net/Dreamkidya/article/details/141292492?spm=1001.2014.3001.5501

位置和层面

  • Servlet过滤器(Filter)
    • Filter是servlet规范的一部分,属于javaEE标准,它位于servlet容器层面上,可以对几乎所有的请求进行拦截
    • 它是在DispatcherServlet之前执行 的,因此它的作用范围更广
  • Spring拦截器(Interceptor)
    • Interceptor是Spring框架的一部分,属于SPring的层面.他主要针对SPring的控制器进行拦截,通常用于对HanderMapping确定的请求进行拦截
    • Interceptor只处理经过DispatcherServlet的请求,因此它的范围小

使用场景

  • Servlet过滤器(Filter)

    • Filter通常用于通用的,与Web应用程序整体相关的功能.例如:编码设置,登录验证,权限检查,跨域问题处理,日志记录.
    • Filter可以拦截所有的请求类型,适合做一些全局性处理.
  • Spring拦截器

    • Interceptor更适合于与业务逻辑紧密相关的功能,如请求进入Controller之前进行预处理(如权限验证),在请求完成之后处理(如日志记录)等
    • 它专注于处理与控制器相关的请求,因此在业务逻辑处理中更加方便灵活

配置方式

Servlet过滤器(Filter)

Filter通过在web.xml文件中配置,或者使用@WebFilter注解来实现和配置。配置完成后,Filter会自动生效

现实过滤器:权限验证(token验证)

首先实现Filter接口--->重写doFilter()方法(此处没重写init()和destory())---->编写代码---->向后或者前返回

java 复制代码
@WebFilter(urlPatterns = "/api/*")
public class TokenFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println("token验证过滤器");
        String token = request.getHeader("token");
        boolean verify = JWTUtil.verify(token);
        if (verify){
            filterChain.doFilter(servletRequest, servletResponse);
        }else {
            Result result = new Result(401,"token认证失败",null);
            servletResponse.getWriter().print(new ObjectMapper().writeValueAsString(result));
        }
    }
}

Spring拦截器(Interceptor)

Interceptor通过实现HandlerInterceptor接口,并在Spring的配置文件中(如spring.xml)进行配置,或者通过**@Configuration**类中的WebMvcConfigurer进行注册

现实拦截器:权限验证(Token验证)

首先实现HandlerInterceptor接口---->重写preHandle()方法----->编写代码---->返回true/false

java 复制代码
public class AdminTokenInterceptor implements HandlerInterceptor {

    /*
    拦截器处理的方法
    当请求到达处理器前,进入到拦截器进行处理
    返回true --- 离开拦截器,向后执行到达处理器
    返回false --- 不在向后执行
    */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String adminToken  = request.getHeader("adminToken");
       //这里假设Token为1234567  这里没有调用Jwt生成Token
        if (adminToken.equals("1234567")){
            return true;
        }else {
            //向前端响应
            Result result = new Result(401,"token验证失败",null);
            response.getWriter().write(new ObjectMapper().writeValueAsString(result));

        }
        return false;
    }
}

注册拦截器

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer{

//	注册配置拦截器
	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration inter =  registry.addInterceptor(new AdminTokenInterceptor());
		inter.addPathPatterns("/**"); //配置进入拦截器的地址
		inter.excludePathPatterns("/loginCtl/login");//放行地址
		//inter.addPathPatterns("/user/**"); //用户需要拦截过滤地址
	}
}

生命周期

  • Servlet过滤器(Filter)

    • Filter的生命周期由Servlet容器管理。Filter在容器启动时初始化,在容器关闭时销毁。
  • Spring拦截器(Interceptor)

    • Interceptor的生命周期由Spring管理。Interceptor的初始化和销毁是与Spring的应用上下文(ApplicationContext)同步的。

执行顺序

  • Servlet过滤器(Filter)

    • Filter链(Filter Chain)中的过滤器是按照配置顺序执行的。Filter可以在请求到达Servlet之前处理,也可以在Servlet处理之后响应返回之前处理。
  • Spring拦截器(Interceptor)

    • Interceptor执行顺序由Spring的配置决定,支持多个拦截器按顺序执行。它提供了三个方法:preHandle、postHandle和afterCompletion,分别用于处理请求的不同阶段。(本文只重写postHandle)

总结

  • 过滤器 适用于全局性的、跨所有资源的处理任务。
  • 拦截器则更适用于特定于业务逻辑的控制器层面的请求处理
  • 在Spring项目中拦截器使用场景较多
相关推荐
侠客行03174 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪4 小时前
深入浅出LangChain4J
java·langchain·llm
子兮曰4 小时前
OpenClaw入门:从零开始搭建你的私有化AI助手
前端·架构·github
吴仰晖4 小时前
使用github copliot chat的源码学习之Chromium Compositor
前端
1024小神4 小时前
github发布pages的几种状态记录
前端
老毛肚6 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎6 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
不像程序员的程序媛6 小时前
Nginx日志切分
服务器·前端·nginx
Yvonne爱编码6 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚6 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言