无锡网页网站制作公司,可信网站认证 技术支持单位,东仓建设网站,青岛广告设计与制作公司拦截器#xff08;Interceptor#xff09;是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截#xff0c;并在请求进入控制器#xff08;Controller#xff09;之前、控制器处理完请求后、甚至是渲染视图后#xff0c;执行一些指定的操作。 在 Spring MV…
拦截器Interceptor是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截并在请求进入控制器Controller之前、控制器处理完请求后、甚至是渲染视图后执行一些指定的操作。 在 Spring MVC 中拦截器的作用与 Servlet 中的过滤器类似它主要用于拦截用户请求并做相应的处理例如通过拦截器我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。 Spring MVC 拦截器使用的是可插拔式的设计如果我们需要某一拦截器只需在配置文件中启用该拦截器即可如果不需要这个拦截器则只要在配置文件中取消应用该拦截器即可。
定义拦截器
想要在 Spring MVC 项目中使用拦截器第一步就是要对拦截器类进行定义。 Spring MVC 在 org.springframework.web.servlet 包中提供了一个 HandlerInterceptor 接口该接口包含 3 个方法如下表。
方法名返回值说明preHandle () boolean该方法在控制器方法之前执行其返回值用来表示是否中断后续操作。 返回值为 true 时表示继续向下执行返回值为 false 时表示中断后续的操作。postHandle (void该方法会在控制器方法调用之后解析式图之前执行。我们可以通过此方法对请求域中的模型Model数据和视图做出进一步的修改。afterCompletion ()void该方法会在整个请求完成后即视图渲染结束之后执行。我们可以通过该方法实现资源清理、日志记录等工作。 通过实现 HandlerInterceptor 接口重写其方法来实现对拦截器类的定义示例代码如下。 public class MyInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(preHandle 执行);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle 执行);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(afterCompletion 执行);}
}
配置拦截器
在定义完拦截器后我们还需要在 Spring MVC 的配置文件中使用 mvc:interceptors 标签及其子标签对拦截器进行配置这样这个拦截器才会生效。 在 Spring MVC 的配置文件中mvc:interceptors 标签用于定义一组拦截器其包含多个常用的子标签具体说明如下表。
标签一级子标签二级子标签说明mvc:interceptorsbean-mvc:interceptors 标签的子标签用于定义一个全局拦截器对所有的请求进行拦截。ref-mvc:interceptors 标签的子标签用于定义一个全局拦截器的引用对所有的请求进行拦截。 mvc:interceptors 标签的 ref 子标签不能单独使用它需要与 bean 标签mvc:interceptors 标签内或 mvc:interceptors标签外或 Component 等注解配合使用以保证ref 标签配置的拦截器是 Spring IOC 容器中的一个组件。mvc:interceptor mvc:mappingmvc:interceptor 标签用于定义一个指定拦截路径的拦截器。 mvc:mapping 标签则是mvc:interceptor 的子标签用来配置拦截器拦截的路径该路径则是通过其属性“path”中定义的。例如path 的属性值为“/**”时表示拦截所有请求而“/hello”则表示拦截路径为“/hello”的请求。mvc:exclude-mappingmvc:exclude-mapping 为mvc:interceptor 的子标签用来配置不需要被拦截器拦截的路径。beanbean 为mvc:interceptor 的子标签用来定义一个指定了拦截路径的拦截器。
1. 通过 bean 子标签配置全局拦截器
在 Spring MVC 的配置文件中通过 mvc:interceptors 标签及其子标签 bean 将我们自定义的拦截器配置成了一个全局拦截器。该拦截器会对项目内所有的请求进行拦截配置代码如下。
!--配置拦截器--
mvc:interceptorsbean classcom.cky.interceptor.MyInterceptor/bean
/mvc:interceptors
2. 通过 ref 子标签配置全局拦截器
除了 bean 标签外还可以在 mvc:interceptors 标签中通过子标签 ref 定义一个全局拦截器引用对所有的请求进行拦截。
!--将自定义的拦截器放到 ioc 容器中--
bean idinterceptor classcom.cky.interceptor.MyInterceptor/bean
!--配置拦截器--
mvc:interceptors!--通过 ref 配置全局拦截器--ref beaninterceptor/ref
/mvc:interceptors
注意mvc:interceptors 标签的 ref 子标签不能单独使用它需要与 bean 标签mvc:interceptors 标签内或mvc:interceptors标签外或 Component 等注解配合使用以保证 ref 标签配置的拦截器是Spring IOC 容器中的组件。
3. 通过mvc:interceptor子标签对拦截路径进行配置
还可以在 Spring MVC 的配置文件中通过 mvc:interceptors 标签的子标签 mvc:interceptor对拦截器拦截的请求路径进行配置示例配置如下。
!--配置拦截器--
mvc:interceptors!--拦截器 1--mvc:interceptor!--配置拦截器拦截的请求路径--mvc:mapping path/**/!--配置拦截器不需要拦截的请求路径--mvc:exclude-mapping path/login/mvc:exclude-mapping path//!--定义在 mvc:interceptors 下表示拦截器只对指定路径的请求进行拦截--bean classcom.cky.interceptor.MyInterceptor/bean/mvc:interceptor
/mvc:interceptors需要注意的是在 mvc:interceptor 中子元素必须按照上述代码的配置顺序进行编写即 mvc:mapping → mvc:exclude-mapping → bean 的顺序否则就会报错。其次以上这三种配置拦截器的方式我们可以根据自身的需求以任意的组合方式进行配置以实现在 mvc:interceptors 标签中定义多个拦截器的目的。
拦截器的执行流程 拦截器的执行流程如下图所示。 拦截器处理流程的步骤如下
当请求的路径与拦截器拦截的路径相匹配时程序会先执行拦截器类MyInterceptor的 preHandl() 方法。若该方法返回值为 true则继续向下执行 Controller控制器中的方法否则将不再向下执行控制器方法对请求进行处理调用拦截器的 postHandl() 方法此时我们可以对请求域中的模型Model数据和视图做出进一步的修改通过 DispatcherServlet 的 render() 方法对视图进行渲染调用拦截器的 afterCompletion () 方法完成资源清理、日志记录等工作。