Spring Boot 统一功能处理:拦截器详解

发布于:2025-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、拦截器核心概念

作用:拦截器是 Spring 框架提供的核心功能,用于在请求处理前后执行预定义逻辑,实现统一处理(如登录校验、日志记录等)。

核心方法

public class LoginInterceptor implements HandlerInterceptor {
    // 目标方法执行前调用(核心控制点)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        return true; // true=放行, false=拦截
    }
    
    // 目标方法执行后调用(Controller 方法执行完毕)
    @Override
    public void postHandle(...) { ... }
    
    // 整个请求完成后的最终处理(视图渲染后)
    @Override
    public void afterCompletion(...) { ... }
}

二、拦截器使用步骤
1. 定义拦截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, ...) {
        // 登录校验示例
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("USER") == null) {
            response.setStatus(401); // 401 Unauthorized
            return false; // 拦截请求
        }
        return true; // 放行
    }
}
2. 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
            .addPathPatterns("/**")          // 拦截所有路径
            .excludePathPatterns("/login")    // 排除登录接口
            .excludePathPatterns("/**/*.js")  // 排除静态资源
            .excludePathPatterns("/**/*.css");
    }
}

三、拦截路径配置规则
路径模式 匹配示例 不匹配示例
/* /user/book /user/login
/** /user/user/profile -
/book/* /book/add/book/detail /book/1/author
/book/** /book/book/1/author /user/books

四、拦截器执行流程


五、登录校验实战案例
1. 拦截器实现
public boolean preHandle(...) {
    if (request.getSession().getAttribute("USER") == null) {
        response.setStatus(401);
        return false;
    }
    return true;
}
2. 前端处理拦截
// AJAX 错误处理
$.ajax({
    error: function(error) {
        if (error.status === 401) {
            window.location.href = "/login.html"; // 跳转登录页
        }
    }
});

六、设计模式:适配器原理

拦截器底层实现

// DispatcherServlet 核心代码
protected void doDispatch(...) {
    // 1. 获取拦截器链
    HandlerExecutionChain mappedHandler = getHandler(request);
    
    // 2. 执行 preHandle()
    if (!mappedHandler.applyPreHandle(request, response)) {
        return; // 拦截请求
    }
    
    // 3. 执行 Controller 方法
    mv = ha.handle(...);
    
    // 4. 执行 postHandle()
    mappedHandler.applyPostHandle(...);
    
    // 5. 渲染视图后执行 afterCompletion()
    processDispatchResult(...);
}

适配器模式应用

  • HandlerAdapter 适配不同类型的控制器(如 @ControllerHttpRequestHandler

  • 解决不同处理器接口的兼容问题


七、最佳实践建议
  1. 路径排除:静态资源(JS/CSS/图片)必须排除

  2. 性能优化:在 preHandle() 中尽早返回拦截结果

  3. 异常处理:结合 @ControllerAdvice 统一处理拦截器抛出的异常

  4. 执行顺序:多个拦截器按注册顺序执行 preHandle(),逆序执行 postHandle()

  5. 生产建议

    • 登录拦截器排除 /login/health 等公开接口

    • 敏感操作(如支付)使用独立拦截器增强校验

// 多拦截器配置示例
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);

总结核心价值

  1. 解耦:将通用逻辑(如鉴权)从业务代码剥离

  2. 复用:一次编写,全局生效

  3. 可维护:统一修改拦截逻辑,避免散弹式修改

  4. 安全:强制实施安全策略(如所有接口必须认证)

通过拦截器 + 统一返回格式 + 统一异常处理,可构建高可维护性的 Spring Boot 后端架构,


网站公告

今日签到

点亮在社区的每一天
去签到