拦截器简介
- SpringMVC的拦截器Interceptor,主要是对Controller资源访问时进行拦截的基本操作的技术,当然拦截后可以进行权限控制,功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter,他们之间的区别如下图所示
-
Filter技术 Interceptor 技术范畴 JavaWeb原生技术 SpringMVC框架技术 拦截/过滤范畴 对所有请求都可以过滤,包括如何Servlet、JSP、其它资源等 只有进行了SpringMVC管理的范畴的才拦截,主要拦截对于Controller的请求 执行时机 早于任何Servlet执行 晚于DispatcherServlet执行
- 实现了HandlerInterceptor接口,且被Spring管理的Bean都是拦截器
-
方法名 参数 返回值 解释 preHandle
HttpServletRequest request
<br>HttpServletResponse response
<br>Object handler
boolean
在请求处理之前被调用。返回值表示是否继续执行后续的拦截器和处理器(如果返回 true
)或中断请求处理(如果返回false
)。可用于登录验证、权限检查等前置处理。postHandle
HttpServletRequest request
<br>HttpServletResponse response
<br>Object handler
<br>ModelAndView modelAndView
无 请求处理之后、视图渲染之前被调用。可以在该方法中对请求处理结果进行修改或增加一些公共数据供视图渲染使用。Handler是拦截到的Controller方法处理器,modelAndView是返回的模型视图对象 afterCompletion
HttpServletRequest request
<br>HttpServletResponse response
<br>Object handler
<br>Exception ex
无 在整个请求完成之后被调用,包括视图渲染完毕。可用于进行一些清理工作,如资源回收、记录请求日志等。Handler是拦截到的Controller方法处理器,ex是异常对象
-
拦截器快速入门
- 创建一个拦截器类实现HandlerInterceptor接口,然后在SpringMVC配置文件中对接口类进行注册
- 创建拦截器实现类
-
package com.example.Interceptor;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class Interceptor01 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandler...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandler....");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion....");} }
-
配置文件
-
拦截器执行顺序
- 当有多个拦截器配置在SpringMVC框架的配置文件中时,执行顺序就是配置顺序,拦截器中方法具体的执行顺序如下图
-
- 上述是preHandler结果返回的都是true的运行顺序的结果
-
- 上述某一个preHandler返回结果为false时。
-
拦截器执行原理
当客户端发出请求之后,SpringMVC框架通过处理器映射器(HandlerMapping)将请求路径与对应资源匹配起来,原先是通过请求地址匹配到Conreoller控制器,现在再加入Interceptror后,在请求到控制器之前,处理器映射器(HandlerMapping)会根据拦截器的地址来处理对应的请求,(一个请求可能被多个拦截器所拦截,但是一个请求只能被一个控制器所处理),然后RequestMappingHandlerMapping将请求可以访问的资源进行封装为HandlerExecutionChain进行返回。然后再执行拦截器中的方法。