当对portlet的某请求最终发送到Controller的前后,可以做一些预处理和后处理,这些处理可以用拦截器来实现,他们往往处理与真实的Controller业务无关的事情,比如安全性检查,日志。

要为某Controller应用一组拦截器可以用以下的步骤:

(1)自定义拦截器的类实现,这些拦截器类必须实现HandlerInterceptor接口

(2) 在Spring 的bean配置文件中定义这些拦截器的类的实例,并且将这些实例添加到

HandlerMapping的bean实例的interceptors属性中。

 
  
  1. <bean id="loggingInterceptor" class="..."/> 
  2. <bean id="securityInterceptor" class="..."/> 
  3. <bean id="portletModeHandlerMapping" 
  4. class="org.springframework.web.portlet.handler.PortletModeHandlerMapping"> 
  5. ... 
  6. <property name="interceptors"> 
  7. <list> 
  8. <ref bean="loggingInterceptor"/> 
  9. <ref bean="securityInterceptor"/> 
  10. </list> 
  11. </property> 
  12. </bean> 

(3) 每一个拦截器最终都实现了HandlerInterceptor接口,因此都有以下几个方法:

 
  
  1. public abstract interface HandlerInterceptor 
  2.   public abstract boolean preHandleAction(ActionRequest paramActionRequest, ActionResponse paramActionResponse, Object paramObject) 
  3.     throws Exception; 
  4.  
  5.   public abstract void afterActionCompletion(ActionRequest paramActionRequest, ActionResponse paramActionResponse, Object paramObject, Exception paramException) 
  6.     throws Exception; 
  7.  
  8.   public abstract boolean preHandleRender(RenderRequest paramRenderRequest, RenderResponse paramRenderResponse, Object paramObject) 
  9.     throws Exception; 
  10.  
  11.   public abstract void postHandleRender(RenderRequest paramRenderRequest, RenderResponse paramRenderResponse, Object paramObject, ModelAndView paramModelAndView) 
  12.     throws Exception; 
  13.  
  14.   public abstract void afterRenderCompletion(RenderRequest paramRenderRequest, RenderResponse paramRenderResponse, Object paramObject, Exception paramException) 
  15.     throws Exception; 
  16.  
  17.   public abstract boolean preHandleResource(ResourceRequest paramResourceRequest, ResourceResponse paramResourceResponse, Object paramObject) 
  18.     throws Exception; 
  19.  
  20.   public abstract void postHandleResource(ResourceRequest paramResourceRequest, ResourceResponse paramResourceResponse, Object paramObject, ModelAndView paramModelAndView) 
  21.     throws Exception; 
  22.  
  23.   public abstract void afterResourceCompletion(ResourceRequest paramResourceRequest, ResourceResponse paramResourceResponse, Object paramObject, Exception paramException) 
  24.     throws Exception; 
  25.  
  26.   public abstract boolean preHandleEvent(EventRequest paramEventRequest, EventResponse paramEventResponse, Object paramObject) 
  27.     throws Exception; 
  28.  
  29.   public abstract void afterEventCompletion(EventRequest paramEventRequest, EventResponse paramEventResponse, Object paramObject, Exception paramException) 
  30.     throws Exception; 

 

在Handler(Controller)执行之前,所有拦截器的preHandleXXX()方法会被依次调用,在Handler(Controller)执行之后,所有拦截器的postHandleXXX() 方法会被依次调用。最终afterXXXCompletion()方法会被调用来执行一些清理工作。