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>
分享到:
相关推荐
这篇文章将教你快速地上手使用 Spring 框架. 如果你手上有一本《Spring in Action》, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring...
该演示项目是在“Spring MVC使用篇”系列文章之前的项目工程的基础上搭建的,因此依赖的基础jar包于第二篇文章中已经介绍过了(点击链接即可查看:Spring MVC使用篇(二)—— 环境搭建),这里便不再赘述。
扩展spring地址方法映射,让spring MVC开发更简便
本Demo使用Spring MVC 框架实现微信公众号开发功能。 本项目为WxJava的Demo演示程序,更多Demo请 查阅此处。 如果想支持多公众号,请参考spring boot版本的demo:...
asp.net mvc handler
Spring Web model-view-controller (MVC)框架是围绕 DispatcherServlet 设计的,并分发请求到处理程序(handler),Spring MVC支持可配置的处理程序映射(handler mapping),视图解析(view resolution)、 区域设置...
spring-rest-exception-handler, 一个方便的RESTful api Spring MVC 异常 spring REST异常处理程序 这个项目的目的是为for提供一个方便的异常处理程序( 解析器),它满足了错误响应的最佳实践。 处理自定义异常。...
即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。 Spring Web MVC也是服务到工作者模式的...
Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。
实现的功能主要是:服务端主动发送消息到客户端,这个的服务端为外网的tomcat,客户端为内网的tomcat,由于无法知道内网tomcat 的地址,也就不能直接通过http的方式发送信息回来,最后想来想去用mina实现了这个功能...
Spring MVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet的作用是截获请求并组织一系列组件共同完成请求的处理工作。 JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它...
弹簧方法拦截器 该示例显示了一个HandlerInterceptor来拦截Web调用并注销注释值。 此示例使用启动2,唯一的区别是您将使用WebMvcConfigurer注册拦截器。
3、HandlerAdapter详解这里spring mvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,
第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 ...
2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...
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
MVC第三课:commond controller及databind的概念【】MVC第二课:通过示例理解spring mvc工作过程【】MVC第五课:@mvc配置与使用方式【】MVC第六课:拦截器、国际化、验证【】MVC第四课:其它常用控制器及handler ...
handler实现图灵机器人-没有网络请求的版本50
.Net WebApi消息拦截器之MessageHandler的示例.docx