`

springmvc入门基础之拦截器

阅读更多

接:http://alog2012.iteye.com/admin/blogs/2040477

Spring为我们提供了:
org.springframework.web.servlet.HandlerInterceptor接口,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
实现这个接口或继承此类,可以非常方便的实现自己的拦截器。
 
有以下三个方法:
 
Action之前执行:
 public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler);
 
生成视图之前执行
 public void postHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler,
   ModelAndView modelAndView);
 
最后执行,可用于释放资源
 public void afterCompletion(HttpServletRequest request,
   HttpServletResponse response, Object handler, Exception ex)
  
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、权限控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
参数中的Object handler是下一个拦截器。

下面是一个自定义的拦截器,实现了 HandlerInterceptor 。

public class MyIntercepor implements HandlerInterceptor {

	/**
	 * 执行时机:视图已经被解析完毕,类似try catch 后的finally
	 */
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception ex)
			throws Exception {
		System.out.println("afterCompletion...");
		ex.printStackTrace();
		System.out.println("================");
	}

	/**
	 * 执行时机:controller执行完,视图解析器没有把视图解析成页面, 对视图做统一的修改,主要体现在Model上
	 */
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView mv) throws Exception {
		System.out.println("postHandler...");
		Map<String, Object> map = mv.getModel();
		map.put("test", "append something");
	}

	/**
	 * 执行时机:在执行controller之前来执行
	 * 返回值类型:boolean
	 * 		true:代表放行可以访问controller,
	 * 		false:不可以访问controller
	 */
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2) throws Exception {
		System.out.println("preHander...");
		return true;
	}

}

 

 

Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。

Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。
当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。
拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。
如果没有找到处理器,那么这个拦截器就不会被执行。

 

在spring MVC的配置文件中配置有三种方法:

方案一,(近似)总拦截器,拦截所有url

<mvc:interceptors>
	<mvc:interceptor>
		<!-- 某一模块的拦截:/{命名空间}/{RequestMapping}[**]; 拦截所有的请求/** -->
		<mvc:mapping path="/**" />
		<bean class="org.study1.mvc.interceptor.MyIntercepor"></bean>
	</mvc:interceptor>
</mvc:interceptors>

   
为什么叫“近似”,前面说了,Spring没有总的拦截器。
<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。
如果是REST风格的URL,静态资源也会被拦截。
 
方案二, HandlerMappint上的拦截器。
如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">       
 <property name="interceptors">       
     <list>       
         <bean class="org.study1.mvc.interceptor.MyIntercepor"></bean>      
     </list>       
 </property>       
</bean>   

 如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。
当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。

更加详细的参见:http://elf8848.iteye.com/blog/875830/ “十九”

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    springmvc拦截器入门实例.zip

    SpringMVC组件之拦截器组件,使用简单,入门级案例代码,类似SpringAOP,可以用来判断是否用户登录

    SpringMVC 拦截器 实现 登录退出功能

    简单的SpringMVC小程序,用Intelli IDEA 编写的,实现拦截器功能,实现了简单的登录、退出功能,是入门的好程序

    SpringMVC入门+myBatis简单示例分享

    SpringMVC+myBatis入门简单示例分享,轻量级 SpringMVC入门+myBatis简单示例分享

    SpringMVC入门教程

    九、 spring mvc 中的拦截器: 十、 spring mvc 如何使用拦截器 十一、 spring mvc 如何实现全局的异常处理 十二、 spring mvc 如何把全局异常记录到日志中 十三、 如何给spring3 MVC中的Action做JUnit单元测试 十四...

    SpringMVC MyBatis项目实战 入门

    第三部分是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和...

    Spring MVC 拦截器入门例子

    拦截器是Spring MVC中一个十分重要且应用广泛的内容。这里简单敲了一个简单的例子,简单易懂

    Spring3+Dwr+JdbcTemplate(拦截器方式实现防止重复提交)

    1.针对SpringMVC注解的配置,可起到入门的作用 2.Spring+JdbcTemplate事物管理 3.Spring+Hibernate事物管理 4.Spring实现DWR注解方式的应用配置 5.Spring配置拦截器 6.Spring通过拦截器实现防止重复提交实例 对学习...

    springMVC教学视频详解(包括spring和mybatis的整合)

    此视频包含:springmvc入门教程(原理分析、环境搭建、前端控制器配置、Handler编写调试、非注解映射器和适配器、注解映射器和适配器、前端控制器源代码分析、视图解析器配置前缀和后缀);springmvc和mybatis整合;...

    SpringMVC教程

    第五章 处理器拦截器详解.pdf 第六章 注解式控制器详解1(注解式控制器运行流程及处理器定义).pdf 第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第六章 注解式控制器详解3(生产者、消费者请求...

    SpringMVC学习笔记整合搭建框架

    8、拦截器 2.Spring入门 2.1.Springmvc是什么 3.3.jdbc编程步骤: 1、加载数据库驱动 2、创建并获取数据库链接 3、创建jdbc statement对象 4、设置sql语句 5、设置sql语句中的参数(使用preparedStatement) 6、通过...

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    10、SpringMVC的异常处理及其拦截器 11、MyBatis简介及其入门 12、MyBatis的配置文件详解 13、MyBatis的多表操作 适用人群: 在校大学生/职场小白 Spring部分: 1、Spring简介 2、Spring快速入门 3、Spring配置...

    跟我学SpringMVC

    第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者...

    跟我学SpringMVC 教程

    第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者...

    SpringMvc开涛.rar

    PDF,源代码 开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 ...第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化

    SpringMvc入门视频教程

    本课程以通俗易懂的方式讲解SpringMVC核心技术,适合初学者的教程,让你少走弯路!1.SpringMVC简介和实现原理、Controller详解、方法的参数2.数据校验、类型转换、统一异常处理3.拦截器、处理AJAX、文件上传下载

    SpringMVC入门视频课程(适合初学者的教程)

    本课程以通俗易懂的方式讲解SpringMVC核心技术,适合初学者的教程,让你少走弯路!1.SpringMVC简介和实现原理、Controller详解、方法的参数2.JSR303数据校验、类型转换、统一异常处理...拦截器、处理AJAX、文件上传下载

    Spring+SpringMVC+Mybatis整合实现增删改查功能(适合入门学习也可以做脚手架开发)

    1.SpringMVC4.3.16,Mybatis3.2.2,Spring4.3.16三大框架的整合; 2、项目基于Maven做依赖管理 3、前端框架集成了Bootstrap3.3.5,Jquery1.12.3,集成了Bootstrap...9、包含了带验证码的登录功能以及登录权限验证的拦截器

    Spring MVC入门教程

    九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? ...

    Spring mvc 入门向导

    spring mvc入门资源,webstore项目贯穿始终,mvc,视图解析器,拦截器restfull,文件上传等方方面面

    Spring MVC 教程 快速入门 深入分析

    九、spring mvc 中的拦截器: 十、spring mvc 如何使用拦截器? 十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? ...

Global site tag (gtag.js) - Google Analytics