Spring拦截器与Servlet过滤器区别

前言

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

目录

前言

位置和层面

使用场景

 配置方式

生命周期

执行顺序

总结


Spring拦截器基础知识icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141825688?spm=1001.2014.3001.5501

Servlet过滤器基础知识icon-default.png?t=N7T8https://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())---->编写代码---->向后或者前返回

@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

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;
    }
}

注册拦截器

@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的配置决定,支持多个拦截器按顺序执行。它提供了三个方法:preHandlepostHandleafterCompletion,分别用于处理请求的不同阶段。(本文只重写postHandle)

总结

  • 过滤器适用于全局性的、跨所有资源的处理任务。
  • 拦截器则更适用于特定于业务逻辑的控制器层面的请求处理
  • 在Spring项目中拦截器使用场景较多
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值