`

springmvc中的handleInterceptor

 
阅读更多

 

转自:https://blog.csdn.net/qq924862077/article/details/53524507

 

对SpringMVC有所了解的人肯定接触过HandlerInterceptor拦截器,HandlerInterceptor接口给我们提供了3个方法:

 

(1)preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行
(2)postHandle:在执行controller的处理后,在ModelAndView处理前执行
(3)afterCompletion :在DispatchServlet执行完ModelAndView之后执行
源码如下:
[java] view plain copy
 
  1. public interface HandlerInterceptor {  
  2.   
  3.       
  4.      /**  
  5.      * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在  
  6.      * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在  
  7.      * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返  
  8.      * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。  
  9.      */    
  10.     boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  11.         throws Exception;  
  12.   
  13.       
  14.     /**  
  15.      * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之  
  16.      * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操  
  17.      * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,  
  18.      * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor  
  19.      * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。  
  20.      */  
  21.     void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
  22.             throws Exception;  
  23.   
  24.       
  25.     /**  
  26.      * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,  
  27.      * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。  
  28.      */   
  29.     void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  30.             throws Exception;  
  31.   
  32. }  
简单实现一个拦截器,几乎并没有做任何实现,可以看之前写的博客springMVC源码分析--国际化实现Session和Cookie(二)LanguageInterceptor的详细实现。
[java] view plain copy
 
  1. public class MyInterceptor implements HandlerInterceptor {  
  2.     /** 
  3.      * @Title: preHandle 
  4.      * @Description: 在执行controller之前运行 
  5.      * @param request 
  6.      * @param response 
  7.      * @param handler 
  8.      * @return 
  9.      * @throws Exception  
  10.      */   
  11.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
  12.         return true;  
  13.     }  
  14.     /** 
  15.      * @Title: postHandle 
  16.      * @Description: 在执行完controller之后,ModelAndView渲染之前开始运行 
  17.      * @param request 
  18.      * @param response 
  19.      * @param handler 
  20.      * @param modelAndView 
  21.      * @throws Exception  
  22.      */   
  23.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
  24.             throws Exception {  
  25.     }  
  26.     /** 
  27.      * @Title: afterCompletion 
  28.      * @Description: 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图后执行 
  29.      * @param request 
  30.      * @param response 
  31.      * @param handler 
  32.      * @param ex 
  33.      * @throws Exception  
  34.      */   
  35.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  36.             throws Exception {  
  37.     }  
  38.       
  39. }  
SpringMVC还提供了HandlerInterceptorAdapter 其是抽象类,也是HandlerInterceptor的子类,在实现了HandlerInterceptor的三个函数后还增加了一个函数。
(1)preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行
(2)postHandle:在执行controller的处理后,在ModelAndView处理前执行
(3)afterCompletion :在DispatchServlet执行完ModelAndView之后执行
(4)afterConcurrentHandlingStarted:这个方法会在Controller方法异步执行时开始执行,而Interceptor的postHandle方法则是需要等到Controller的异步执行完才能执行,只要继承这个类并实现其方法就可以了。
[java] view plain copy
 
  1. public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {  
  2.     /** 
  3.      * This implementation always returns {@code true}. 
  4.      */  
  5.     @Override  
  6.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  7.         throws Exception {  
  8.         return true;  
  9.     }  
  10.     /** 
  11.      * This implementation is empty. 
  12.      */  
  13.     @Override  
  14.     public void postHandle(  
  15.             HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)  
  16.             throws Exception {  
  17.     }  
  18.     /** 
  19.      * This implementation is empty. 
  20.      */  
  21.     @Override  
  22.     public void afterCompletion(  
  23.             HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  24.             throws Exception {  
  25.     }  
  26.     /** 
  27.      * This implementation is empty. 
  28.      */  
  29.     @Override  
  30.     public void afterConcurrentHandlingStarted(  
  31.             HttpServletRequest request, HttpServletResponse response, Object handler)  
  32.             throws Exception {  
  33.     }  
  34.   
  35. }  
AsyncHandlerInterceptor也是一个接口,提供了afterConcurrentHandlingStarted方法定义
[java] view plain copy
 
  1. public interface AsyncHandlerInterceptor extends HandlerInterceptor {  
  2.   
  3.     /** 
  4.      * Called instead of {@code postHandle} and {@code afterCompletion}, when 
  5.      * the a handler is being executed concurrently. 
  6.      * <p>Implementations may use the provided request and response but should 
  7.      * avoid modifying them in ways that would conflict with the concurrent 
  8.      * execution of the handler. A typical use of this method would be to 
  9.      * clean up thread-local variables. 
  10.      * 
  11.      * @param request the current request 
  12.      * @param response the current response 
  13.      * @param handler the handler (or {@link HandlerMethod}) that started async 
  14.      * execution, for type and/or instance examination 
  15.      * @throws Exception in case of errors 
  16.      */  
  17.     void afterConcurrentHandlingStarted(  
  18.             HttpServletRequest request, HttpServletResponse response, Object handler)  
  19.             throws Exception;  
  20.   
  21. }  
分享到:
评论

相关推荐

    SpringMVC中文教程

    ### SpringMVC中文教程知识点概览 #### 一、SpringMVC简介 SpringMVC是Spring框架的一个模块,专门用于简化Web应用程序...希望本文档能为读者提供足够的基础知识和实践经验,以便能够在实际项目中成功应用SpringMVC。

    springMVC中文开发指南

    springMVC 中文开发指南,适合新手,适合初学者!

    SpringMVC 中xml文件的读取与显示

    在SpringMVC中,XML配置文件扮演着关键角色,它们定义了组件的装配方式,如控制器、服务、数据源等。这篇内容将深入探讨SpringMVC中XML文件的读取与显示,并结合JSP页面的实现。 首先,我们需要理解SpringMVC的配置...

    开源框架面试题系列:Spring+SpringMVC+MyBatis.zip

    在IT行业中,开源框架是构建复杂应用程序的重要工具,Spring、SpringMVC和MyBatis作为Java领域的三大核心框架,被广泛应用于企业级开发。本文将深入探讨这些框架的基础概念、核心功能以及在面试中可能遇到的相关问题...

    springMVC练手代码

    2. **配置文件**:SpringMVC的配置通常在XML文件(如`servlet-context.xml`)中进行,包括视图解析器、模型-视图映射、拦截器、以及bean的定义。这些配置会指导SpringMVC如何处理请求和响应。 3. **模型(Model)**:...

    SpringMVC PPT_springmvc_

    ViewResolver 是视图解析器,它的职责是根据 ModelAndView 中的视图名,找到具体的视图进行渲染。SpringMVC 支持多种视图技术,如 JSP、FreeMarker、Thymeleaf 等。 七、注解驱动开发 SpringMVC 提供了丰富的注解,...

    SpringMVC demo 完整源码实例下载.zip

    在这个"SpringMVC demo 完整源码实例下载.zip"压缩包中,我们可以深入学习和理解SpringMVC的各种核心特性和实际应用。 首先,SpringMVC通过DispatcherServlet作为前端控制器,它负责接收HTTP请求,并根据请求的URL...

    IDEA社区版编写的SpringMVC小项目

    这个项目可以作为学习SpringMVC的起点,帮助理解如何在IDEA中配置和运行SpringMVC项目,以及如何利用其特性处理实际问题。通过这个小项目,你可以深入理解SpringMVC的运作机制,为进一步的Web开发打下坚实的基础。

    springmvc控制器映射

    spring mvc视频 之控制器映射

    SpringMVC API

    在SpringMVC中,核心组件包括DispatcherServlet、ModelAndView、Controller、ViewResolver等。DispatcherServlet作为入口点,负责接收HTTP请求,并根据配置的HandlerMapping找到对应的Controller进行处理。...

    SpringMVC Demo_java_springmvc_DEMO_

    这个名为"SpringMVC Demo_java_springmvc_DEMO_"的项目是一个演示示例,旨在展示如何在Java项目中集成和使用SpringMVC。通过这个项目,我们可以学习到以下关键知识点: 1. **环境配置**:首先,我们需要一个Java...

    SpringMVC学习编程代码

    在SpringMVC中,我们首先会接触到配置文件,这通常是`springmvc-config.xml`,在这个文件中,我们会定义DispatcherServlet,它是SpringMVC的入口点,负责处理所有的HTTP请求。同时,这里还会配置视图解析器,如`...

    SpringMVC完整文档PDF

    这份文档可能从快速入门示例开始,引导读者理解基本概念,然后逐步深入,探讨更高级的话题,如拦截器、AOP(面向切面编程)在SpringMVC中的应用,以及如何集成WebSocket进行实时通信。此外,它可能还会讨论最佳实践...

    SpringMVC+Mysql实例详解

    在这个实例详解中,我们将深入理解SpringMVC的核心概念以及如何与MySQL数据库进行集成。 首先,我们从SpringMVC的基本组件开始。在MVC模式中,“模型”负责处理业务逻辑和数据管理,通常由JavaBeans或实体类表示;...

    SpringMVC+Mybatis demo

    SpringMVC和MyBatis是Java Web开发中的两个核心框架,它们在构建高效、模块化的应用程序方面发挥着重要作用。SpringMVC是Spring框架的一部分,主要负责处理HTTP请求和响应,而MyBatis则是一个轻量级的持久层框架,...

    springMVC拦截器项目

    SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...

    SpringMVC-Helloworld

    2. **配置文件**:在SpringMVC中,通常有两个重要的配置文件:`servlet-context.xml`(Spring MVC配置)和`applicationContext.xml`(Spring核心配置)。在"SpringMVCLearningChapter1"里,我们可能会看到如何在`...

    SpringMVC4.2.4中文文档 PDF-高清带书签版本

    2. **配置与设置**:讲解如何在项目中配置SpringMVC,包括web.xml中的DispatcherServlet配置、Spring MVC的配置文件、以及如何将SpringMVC集成到Spring IoC容器中。 3. **处理器映射器与适配器**:解释...

    SpringMVC+Hibernate+EXT

    SpringMVC+Hibernate+EXT的整合是Web开发中的常见模式,用于构建高效、功能丰富的企业级应用。SpringMVC作为控制器,处理HTTP请求并调用业务逻辑;Hibernate作为数据访问层,负责与数据库的交互;EXTJS作为前端展示...

Global site tag (gtag.js) - Google Analytics