38-Springmvc拦截器概述以及简单实现(和过滤器的区别)

一、概述

Spring MVC拦截器(Interceptor)是Spring MVC框架中的一个组件,用于拦截处理器(Handler)的执行。它可以在请求到达控制器之前或之后进行一些预处理或后处理操作。Spring MVC拦截器可以应用于整个Web应用程序或特定的URL路径,以实现以下功能:

  • 鉴权和身份验证:拦截器可以验证用户的身份、权限,并决定是否允许请求继续执行。
  • 参数预处理和后处理:拦截器可以在请求到达控制器之前对请求参数进行预处理(如数据校验、数据转换等),并在请求处理完成后对响应进行后处理(如统一封装返回结果)。
  • 日志记录:拦截器可以记录请求的相关信息,如请求路径、请求参数、处理时间等,用于系统监控和排查问题。
  • 异常处理:拦截器可以捕获控制器抛出的异常,并进行统一的异常处理,例如返回统一的错误信息或进行特定的业务处理。

实现一个Spring MVC拦截器通常需要实现HandlerInterceptor接口,并重写其中的方法,包括 preHandle、postHandle 和 afterCompletion。

  • preHandle 方法在请求到达控制器之前被调用,可以进行一些前置处理,如对请求进行校验、权限验证等。返回值决定是否继续执行后续操作。
  • postHandle 方法在控制器处理请求后、视图渲染之前被调用,可以对响应结果进行一些处理,如添加额外的数据、修改视图等。
  • afterCompletion 方法在整个请求处理完成后被调用,无论是正常返回还是抛出异常,都会被调用。可以进行一些清理操作,如资源释放、日志记录等。

拦截器可以通过配置来指定拦截的路径、排除的路径等,以满足不同的需求。在Spring MVC框架中,拦截器是一种有用的机制,它能够在请求处理过程中增加额外的功能和处理逻辑,实现模块化的功能划分和复用。

二、过滤器(Filter)和拦截器(Interceptor)都是用于在Web应用程序中对请求进行处理和拦截的组件,但它们在实现方式、功能和作用范围上有一些区别和相似之处。

区别:

  1. 实现方式: 过滤器是基于Servlet规范的组件,由 javax.servlet.Filter 接口定义,通过在web.xml配置文件或使用注解来进行配置。而拦截器是基于Spring MVC或其他Web框架的组件,由特定接口或类定义,并且由框架自身进行管理和调用。

  2. 作用范围: 过滤器作用于Servlet容器级别,可以拦截所有经过Servlet容器的请求和响应,包括静态资源的访问。而拦截器只针对特定的URL路径,只能拦截和处理经过框架处理的请求。

  3. 触发时机: 过滤器在请求进入Servlet容器后、进入Servlet之前被调用,在请求处理完毕后、响应返回客户端之前被调用。拦截器则是在Web框架的请求处理流程中被触发,通常在控制器之前或之后被调用。

  4. 依赖关系: 过滤器依赖于Servlet容器,与具体的Web框架无关。而拦截器是Web框架提供和管理的组件,需要依赖于该框架。

相似:

  1. 功能: 过滤器和拦截器都能够对请求进行预处理和后处理操作,如验证身份、处理参数、修改请求或响应等。

  2. 可扩展性: 过滤器和拦截器都具有很好的扩展性,可以根据需要进行定制和扩展功能。开发者可以自定义过滤器或拦截器,并配置它们来满足特定的业务需求。

  3. 多个并发执行: 过滤器和拦截器都支持多个并发执行,可以通过在配置中指定顺序来控制它们的执行顺序。

三、实现案例

1.创建一个类来实现HandlerInterceptor接口,并实现其中的方法:

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行预处理,返回true表示继续执行请求,返回false表示中断请求
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理完成后的后处理操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后的资源清理操作
    }
}

 2.在Spring MVC配置中注册拦截器,并指定拦截的路径: 

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private MyInterceptor myInterceptor;

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

上述示例中,我们通过addInterceptor方法将自定义的拦截器添加到拦截器注册表中,并使用addPathPatterns方法指定拦截的请求路径。 

配置拦截规则:可以使用addPathPatterns方法指定要拦截的路径,也可以使用excludePathPatterns方法排除某些路径不被拦截。

registry.addInterceptor(myInterceptor)
    .addPathPatterns("/**")
    .excludePathPatterns("/login", "/register");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值