`

spring MVC之用Handler Interceptor拦截请求

 
阅读更多

spring MVC之用Handler Interceptor拦截请求

----------

 

用Handler Interceptor拦截请求

 

Servlet API定义的Servlet过滤器可以在Servlet处理每个web请求的前后分别对它进行前置处理和后置处理。你想要在Spring的web应用程序上下文中配置一些类似于过滤器的东西,以使能够利用容器特性。此外,有些时候,你可能只想处理由某些Spring MVC处理程序处理的Web请求,并在这些处理程序返回的模型属性被传递到视图之前,对它们进行一些操作。

 

 

Spring MVC允许你通过处理拦截拦截web请求,进行前置处理后置处理。处理拦截是在Spring的web应用程序上下文中配置的,因此它们可以利用各种容器特性,并引用容器中声明的任何Bean。处理拦截是针对特殊的处理程序映射进行注册的,因此它只拦截通过这些处理程序映射的请求。每个处理拦截都必须实现HandlerInterceptor接口,它包含三个需要你实现的回调方法:preHandle(),postHandle()afterCompletion()第一个第二个方法分别是在处理程序处理请求之前之后被调用的。第二个方法还允许访问返回的ModelAndView对象,因此可以在它里面操作模型属性。最后一个方法是在所有请求处理完成之后被调用的(如视图呈现之后).

 

 

假设你要测量请求处理程序在处理每个web请求时所花的处理时间,可以创建一个定制的处理拦截:

package com.apress.springrecipes.court.web;
...
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MeasurementInterceptor implements HandlerInterceptor{
	public boolean preHandle(HttpServletRequest request,
		HttpServletResponse response,Object handler)throws Exception{{
		long startTime = System.currentTimeMillis();
		request.setAttribute("startTime",startTime);
		return true;
	}
	public void postHandle(HttpServletRequest request,HttpServletResponse response,
		Object handler,ModelAndView modelAndView)throws Exception{
		long startTime = (Long)request.getAttribute("startTime");
		request.removeAttribute("startTime");
		long endTime = System.currentTimeMillis();
		modelAndView.addObject("handlingTime",endTime-startTime);
	}
	public void afterCompletion(HttpServletRequest request,
		HttpServletResponse response,Object handler,Exception ex)throws Exception{
		
	}
}

在这个拦截器的preHandler()方法中,你记录了起始时间,并将它保存到请求属性中。这个方法应该返回true,允许DispatcherServlet继续处理请求。否则,DispatcherServlet会认为这个方法已经处理了请求,直接将响应返回给用户。然后,在postHandler()方法中,从请求属性中加载起始时间,并将它与当前时间进行比较。你可以计算总的持续时间,然后把这个时间添加到模型中,传递给视图。最后,afterCompletion()方法无事可做,空着就可以了。

 

 

在实现接口时,即使不需要,也必须实现所有的方法。更好的方法是扩展拦截器适配器类。这个类默认实现所有的拦截器方法,你可以只覆盖你需要的方法。 

package com.apress.springrecipes.court.web;
...
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MeasurementInterceptor extends HandlerInterceptorAdapter{
	public boolean preHandle(HttpServletRequest request,
		HttpServletResponse response,Object handler)throws Exception{
		....
	}
	public void postHandle(HttpServletRequest request,HttpServletResponse response,
		Object handler,ModelAndView modelAndView)throws Exception{
		....	
	}
}

 

 

处理程序映射Bean注册处理拦截,来拦截由这个Bean映射的web请求。你可以在interceptors属性中为处理程序映射指定多个拦截器,该属性是数组类型的。如果在web应用程序上下文中配置了不止一个处理程序映射,并且想要拦截由它们映射的所有请求,就必须在每一个处理程序映射中注册这个拦截器。 

<beans...>
	...
	<bean id="measurementInterceptor" 
		class="com.apress.springrecipes.court.web.MeasurementInterceptor"/>
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="interceptors">
			<list>
				<ref bean="measurementInterceptor"/>
			</list>
		</property>
		...
	</bean>
	<bean class="org.springframework.web.servlet.mvc.support
		.ControllerClassNameHandlerMapping">
		<property name="interceptors">
			<list>
				<ref bean="measurementInterceptor"/>
			</list>
		</property>
	</bean>
	....
</beans>

 

 

 

 

 

 

分享到:
评论
1 楼 李君寻 2014-10-17  

相关推荐

    Spring MVC 入门实例

    这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring...

    Spring MVC— 处理器(Handler)方法的返回值.docx

    该演示项目是在“Spring MVC使用篇”系列文章之前的项目工程的基础上搭建的,因此依赖的基础jar包于第二篇文章中已经介绍过了(点击链接即可查看:Spring MVC使用篇(二)—— 环境搭建),这里便不再赘述。

    spring-ext-handler-mapping.rar_ext_spring ext_spring mvc

    扩展spring地址方法映射,让spring MVC开发更简便

    基于Spring MVC 和 WxJava 实现的微信公众号Java后端Demo

    本Demo使用Spring MVC 框架实现微信公众号开发功能。 本项目为WxJava的Demo演示程序,更多Demo请 查阅此处。 如果想支持多公众号,请参考spring boot版本的demo:...

    asp.net mvc handler

    asp.net mvc handler

    spring mvc 3.2 参考文档

    Spring Web model-view-controller (MVC)框架是围绕 DispatcherServlet 设计的,并分发请求到处理程序(handler),Spring MVC支持可配置的处理程序映射(handler mapping),视图解析(view resolution)、 区域设置...

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常.zip

    spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...

    springmvc demo

    即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。 Spring Web MVC也是服务到工作者模式的...

    Spring MVC简介.docx

    Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。

    spring mvc + Mina 配置部署

    实现的功能主要是:服务端主动发送消息到客户端,这个的服务端为外网的tomcat,客户端为内网的tomcat,由于无法知道内网tomcat 的地址,也就不能直接通过http的方式发送信息回来,最后想来想去用mina实现了这个功能...

    Spring MVC 员工管理系统

    Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是截获请求并组织一系列组件共同完成请求的处理工作。 JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它...

    spring-method-interceptor:Spring Handler Interceptor反思Web方法

    弹簧方法拦截器 该示例显示了一个HandlerInterceptor来拦截Web调用并注销注释值。 此示例使用启动2,唯一的区别是您将使用WebMvcConfigurer注册拦截器。

    第三课:spring mvc 原理深度解析1

    3、HandlerAdapter详解这里spring mvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,

    看透springMvc源代码分析与实践

    第10章 Spring MVC之用108 10.1 HttpServletBean108 10.2 FrameworkServlet108 10.3 DispatcherServlet114 10.4 doDispatch结构118 10.5 小结123 第三篇 Spring MVC组件分析 第11章 组件概览126 11.1 ...

    Spring MVC 学习笔记

    2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...

    spring mvc

    The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet that dispatches requests to handlers, with configurable handler mappings, view resolution, locale and theme ...

    spring boot exception handler.zip

    spring boot exception handler.zip

    SpringMVC3.0系列视频教程(walker主讲)

    MVC第三课:commond controller及databind的概念【】MVC第二课:通过示例理解spring mvc工作过程【】MVC第五课:@mvc配置与使用方式【】MVC第六课:拦截器、国际化、验证【】MVC第四课:其它常用控制器及handler ...

    handler实现图灵机器人-没有网络请求的版本

    handler实现图灵机器人-没有网络请求的版本50

    .Net WebApi消息拦截器之MessageHandler的示例.docx

    .Net WebApi消息拦截器之MessageHandler的示例.docx

Global site tag (gtag.js) - Google Analytics