Spring 拦截器基于 Java 的 AOP(面向切面编程)实现。在 Spring 中,拦截器是通过实现 HandlerInterceptor 接口来定义的。这个接口有三个方法:
- preHandle:在请求处理之前调用,返回值为 true 表示继续进行处理,返回值为 false 表示中断处理流程。
- postHandle:在请求处理之后调用,但在视图被渲染之前调用,所以可以在这个方法中修改数据模型。
- afterCompletion:在视图被渲染之后调用,释放资源等。
当一个请求到达 Spring MVC 的 DispatcherServlet 时,DispatcherServlet 会将请求传递给 HandlerMapping,HandlerMapping 会根据 URL 和其他信息找到对应的 Handler,并将其封装成一个 HandlerExecutionChain 对象。这个对象包含了一个或多个 HandlerInterceptor。
在请求处理过程中,DispatcherServlet 会按照 HandlerExecutionChain 中的拦截器顺序依次执行拦截器的 preHandle 方法,如果有一个拦截器返回了 false,则后续拦截器和请求处理方法都不会执行,直接返回给客户端。如果所有拦截器都返回 true,则继续执行请求处理方法。在请求处理方法执行完毕后,DispatcherServlet 会按照相反的顺序依次执行拦截器的 postHandle 和 afterCompletion 方法。
拦截器的作用
(第二章:6登录信息)
- 拦截器示例
- 定义拦截器,实现Handlerlnterceptor
- 配置拦截器,为它指定拦截、排除的路径
- 拦截器应用
- 在请求开始时查询登录用户
- 在本次请求中持有用户数据
- 在模板视图上显示用户数据
- 在请求结束时清理用户数据
目的:让未登录用户不能访问某些页面
原理:在方法前标注自定义注解,拦截所有的请求,只处理带有该注解的方法。
Interceptor是SpringMVC的处理器(handler)拦截器,用于对处理器进行预处理和后处理。本项目中,每次请求都会检查request中的login_ticket,把找到的user信息存放在协程中,并在完成处理后,自动释放。(方便的进行用户信息取用)