SpringMVC拦截器

一、什么是拦截器?

拦截器(Interceptor) 是 SpringMVC 提供的一种可插拔式组件,用于在请求处理的不同阶段执行特定操作(如权限验证、日志记录等)。与 Servlet 的过滤器(Filter)类似,但拦截器更专注于 Controller 层的请求处理,且与 SpringMVC 深度集成。
通过配置文件,开发者可以灵活启用或禁用拦截器,无需修改业务代码。

二、拦截器 vs 过滤器:核心区别

特性 拦截器(Interceptor) 过滤器(Filter)
作用范围 仅对 Controller 层请求生效 对所有请求生效(包括静态资源)
技术依赖 基于 SpringMVC 框架 基于 Servlet 规范
执行顺序 在 Controller 方法前后执行 在请求进入 Servlet 前执行
依赖容器 由 Spring 容器管理 由 Tomcat 等 Servlet 容器管理

执行流程对比

用户请求 → Tomcat → Filter → DispatcherServlet → Interceptor → Controller

三、拦截器的核心方法

自定义拦截器需实现 HandlerInterceptor 接口,该接口定义了三个关键方法:

  1. preHandle()

    • 执行时机:Controller 方法调用前。

    • 返回值

      • true:放行请求,继续执行后续拦截器或 Controller。

      • false:拦截请求,终止后续流程。

    • 典型应用:权限验证、请求预处理。

  2. postHandle()

    • 执行时机:Controller 方法执行后,视图渲染前。

    • 典型应用:修改 ModelAndView 数据,如统一添加公共参数。

  3. afterCompletion()

    • 执行时机:请求处理完成后(视图渲染结束)。

    • 典型应用:资源清理、日志记录。

四、拦截器执行流程详解

1. 单个拦截器执行流程

1. preHandle() → 2. Controller → 3. postHandle() → 4. 视图渲染 → 5. afterCompletion()

2. 多个拦截器执行流程

假设配置顺序为 Interceptor1 → Interceptor2

  • preHandle():按配置顺序执行(1 → 2)。

  • postHandle() 和 afterCompletion():按配置逆序执行(2 → 1)。

五、实战:登录权限验证拦截器

1. Controller 层代码

@Controller
public class LoginController {
    @GetMapping("/login")
    public String loginPage() {
        return "login";
    }

    @PostMapping("/login")
    public String login(User user, Model model, HttpSession session) {
        if ("admin".equals(user.getUsername()) && "123456".equals(user.getPassword())) {
            session.setAttribute("user", user);
            return "redirect:/index";
        }
        model.addAttribute("msg", "账号或密码错误");
        return "login";
    }

    @GetMapping("/index")
    public String index() {
        return "index";
    }
}

 2. 拦截器实现

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI();
        // 放行登录请求
        if (url.contains("login")) return true;

        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            return true; // 已登录,放行
        } else {
            request.setAttribute("msg", "请先登录!");
            request.getRequestDispatcher("/login").forward(request, response);
            return false; // 拦截请求
        }
    }
}

3. SpringMVC 配置


    
        
        
        
    

六、注意事项与优化建议

  1. 拦截器与过滤器的选择

    • 若需处理静态资源或全局请求,使用过滤器。

    • 若需精细化控制 Controller 层逻辑,使用拦截器。

  2. 拦截器链的顺序

    • 在配置文件中,越靠前的拦截器,其 preHandle() 越早执行。

  3. 性能优化

    • 在 preHandle() 中避免复杂业务逻辑,以减少请求延迟。


七、总结

SpringMVC 拦截器通过灵活的钩子方法,为开发者提供了强大的请求处理扩展能力。无论是权限验证、日志记录,还是数据预处理,拦截器都能以低侵入的方式实现需求。结合本文的实战示例,读者可快速掌握拦截器的核心用法,并在项目中灵活应用。

你可能感兴趣的:(spring,拦截器)