`

Handler Interceptor与UriComponent

阅读更多

1.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请求时所花的处理时间,可以创建一个定制的处理拦截:

Java代码  收藏代码
  1. package com.apress.springrecipes.court.web;  
  2. ...  
  3. import org.springframework.web.servlet.HandlerInterceptor;  
  4. import org.springframework.web.servlet.ModelAndView;  
  5.   
  6. public class MeasurementInterceptor implements HandlerInterceptor{  
  7.     public boolean preHandle(HttpServletRequest request,  
  8.         HttpServletResponse response,Object handler)throws Exception{{  
  9.         long startTime = System.currentTimeMillis();  
  10.         request.setAttribute("startTime",startTime);  
  11.         return true;  
  12.     }  
  13.     public void postHandle(HttpServletRequest request,HttpServletResponse response,  
  14.         Object handler,ModelAndView modelAndView)throws Exception{  
  15.         long startTime = (Long)request.getAttribute("startTime");  
  16.         request.removeAttribute("startTime");  
  17.         long endTime = System.currentTimeMillis();  
  18.         modelAndView.addObject("handlingTime",endTime-startTime);  
  19.     }  
  20.     public void afterCompletion(HttpServletRequest request,  
  21.         HttpServletResponse response,Object handler,Exception ex)throws Exception{  
  22.           
  23.     }  
  24. }  

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

 

 

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

Java代码  收藏代码
  1. package com.apress.springrecipes.court.web;  
  2. ...  
  3. import org.springframework.web.servlet.ModelAndView;  
  4. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  5.   
  6. public class MeasurementInterceptor extends HandlerInterceptorAdapter{  
  7.     public boolean preHandle(HttpServletRequest request,  
  8.         HttpServletResponse response,Object handler)throws Exception{  
  9.         ....  
  10.     }  
  11.     public void postHandle(HttpServletRequest request,HttpServletResponse response,  
  12.         Object handler,ModelAndView modelAndView)throws Exception{  
  13.         ....      
  14.     }  
  15. }  

 

 

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

Xml代码  收藏代码
  1. <beans...>  
  2.     ...  
  3.     <bean id="measurementInterceptor"   
  4.         class="com.apress.springrecipes.court.web.MeasurementInterceptor"/>  
  5.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  6.         <property name="interceptors">  
  7.             <list>  
  8.                 <ref bean="measurementInterceptor"/>  
  9.             </list>  
  10.         </property>  
  11.         ...  
  12.     </bean>  
  13.     <bean class="org.springframework.web.servlet.mvc.support  
  14.         .ControllerClassNameHandlerMapping">  
  15.         <property name="interceptors">  
  16.             <list>  
  17.                 <ref bean="measurementInterceptor"/>  
  18.             </list>  
  19.         </property>  
  20.     </bean>  
  21.     ....  
  22. </beans>  

 

 

 

2.Uricomponent

 

是一个工具类,帮助我们生成URL。如uriComonentsBuilder类使用方法:

 

UriComonentsBuilder.fromUriString(XXX).qureyParam(K,V).build().tostring()

 

 

 

 

分享到:
评论

相关推荐

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

    if (handler instanceof HandlerMethod && ((HandlerMethod) handler).getMethodAnnotation(CustomAnnotation.class) != null) { // 拦截到带有@CustomAnnotation的方法,这里可以添加自定义逻辑 } return true;...

    Fragment与Activity使用Handler进行交互

    通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在Fragment和Activity之间使用Handler,通常涉及以下步骤: 1. **创建Handler实例**:...

    handler与listener的区别

    - `handler`通常与`Action`对象关联。`Action`允许你创建可重用的行为,它可以被多个组件引用。这有助于代码的复用和模块化。 - `Action`对象具有五个主要属性:`text`(文本内容)、`handler`(处理函数)、`...

    Handler使用

    `Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...

    android 中Handler 的几种写法

    基本的`Handler`使用通常涉及到创建`Handler`对象,然后在后台线程中通过`Looper`和`Message`与之交互。以下是一个简单的例子: ```java // 在主线程中创建Handler Handler mHandler = new Handler() { @...

    Handler与AsyncTask使用示例

    `Handler`通常与`Looper`配合使用,创建一个消息循环,使得`Handler`能够接收到并处理来自其他线程的消息。`Handler`的工作原理是,当创建一个`Handler`对象时,它会与当前线程的`Looper`关联,然后可以发送`Message...

    线程,线程池与Handler的用法

    在Android开发中,线程和线程池是处理异步任务的重要工具,而Handler则是用于在主线程和子线程之间通信的关键组件。本篇文章将深入探讨这些概念,以及它们在实际应用中的用法。 首先,让我们理解什么是线程。线程是...

    jobHandler调度器

    "JobHandler调度器"是一种广泛应用于分布式任务调度的框架,主要设计用于处理大规模并发和定时任务的场景。在这个系统中,JobHandler是核心组件,它负责执行具体的业务逻辑。下面我们将详细探讨JobHandler调度器的...

    Looper、Handler与HandlerThread

    2. 在HandlerThread内部,创建一个Handler实例,这样Handler就会与HandlerThread的Looper关联。 3. 使用主线程中的Handler实例,通过`sendMessage()`或者`post()`方法发送消息到后台线程的Handler,这些消息会被放入...

    Handlerjava代码实现

    这通常在UI线程中完成,因为`Handler`与运行它的线程绑定。创建`Handler`时,可以重写`handleMessage(Message msg)`方法来定义处理消息的方式: ```java Handler handler = new Handler() { @Override public ...

    Foxit PDF Preview Handler

    Foxit PDF Preview Handler 是一款专为Outlook 2007设计的插件,它使得用户可以在不离开邮件客户端的情况下预览PDF附件。这款工具极大地提升了处理PDF文档的效率,尤其是在处理大量PDF邮件附件时,避免了频繁打开...

    一个activity中多个handler和消息的处理过程

    默认情况下,只有一个Looper与主线程关联,这就是为什么通常我们只需要在主线程中初始化Handler。如果需要在工作线程中使用Handler,我们需要手动调用Looper.prepare()和Looper.loop()来启动一个Looper。 消息的...

    Android_Handler详解(一)

    在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? ...

    handler的简单示例

    当我们在主线程中创建一个Handler实例时,这个Handler会自动与当前线程的Looper绑定。我们可以通过Handler发送Message对象到消息队列,Looper会按照先进先出(FIFO)的规则将这些消息传递给Handler来处理。 创建...

    Handler 推荐用法 demo

    在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是主线程(UI线程)与工作线程之间的交互。本`Handler`推荐用法的示例,旨在帮助开发者理解和掌握如何有效地使用`Handler`来管理...

    Android 之 Looper、MessageQueue、Handler 与消息循环

    ### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...

    安卓handler的使用

    在Android应用开发中,Handler是一种重要的线程通信机制,它与Looper、Message紧密配合,用于在不同的线程间传递消息,解决多线程同步问题。本篇将详细讲解Handler的使用,包括如何创建Handler对象、如何发送和处理...

    handler用法

    注意,Handler的生命周期与创建它的上下文(通常是Activity)紧密关联。当Activity销毁时,Handler也应该被清理,否则可能会导致内存泄漏。因此,通常会在Activity的onCreate()方法中创建Handler,在onDestroy()方法...

    android handler 机制 源码

    4. Looper从消息队列中取出Message,检查其目标Handler是否与当前正在运行的Handler匹配。 5. 如果匹配,Looper将调用Handler的`handleMessage(Message msg)`方法处理消息。 源码分析: Handler的`sendMessage...

Global site tag (gtag.js) - Google Analytics