Interceptor拦截器

Spring拦截器详解

Interceptor拦截器

介绍:

Spring 拦截器(Interceptor)是 Spring MVC 框架中的核心组件,用于在请求处理的预处理后处理完成后三个阶段插入自定义逻辑,实现请求过滤、权限校验、日志记录、性能监控等横切关注点(Cross-Cutting Concerns)。

与Filter的区别

特性拦截器 (Interceptor)过滤器 (Filter)
所属框架Spring MVCServlet 规范
作用范围仅 Spring MVC 处理的请求(DispatcherServlet 之后)所有 Web 请求(包括静态资源、非 Spring 处理的请求)
执行时机在 HandlerMethod 执行前后、视图渲染前后在请求进入 Servlet 容器后、DispatcherServlet 之前

使用方法

核心接口

public interface HandlerInterceptor {
    //先进行此方法,返回True才进行对应controller方法
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	//执行完controller后执行此方法
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }
	//视图渲染完成执行此方法
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

实现类

public class LogInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //拦截器时进行的操作
        return true;
    }

    // 后处理:可修改视图模型
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //可返回一些内容给视图
    }

    // 完成后处理:记录请求耗时
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 获取请求开始时间,计算耗时
        long startTime = (long) request.getAttribute("startTime");
        long costTime = System.currentTimeMillis() - startTime;

        // 记录响应状态码和耗时
        int status = response.getStatus();
        logger.info("请求完成:状态码{},耗时{}ms", status, costTime);

        // 若有异常,记录异常信息
        if (ex != null) {
            logger.error("请求处理异常", ex);
        }
    }
}

注册拦截器到 Spring 容器

@Configuration // 标记为配置类,Spring 启动时自动扫描
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 注册自定义拦截器
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册日志拦截器(也可通过依赖注入)
        registry.addInterceptor(new LogInterceptor())//进行此拦截器里的内容
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/static/**", "/error"); //不做拦截的路径

        // 可注册多个拦截器(执行顺序与注册顺序一致)
        // registry.addInterceptor(new AuthInterceptor())
        //         .addPathPatterns("/api/**") // 仅拦截 /api/ 下的请求
        //         .excludePathPatterns("/api/login"); // 排除登录接口
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值