Spring HandlerInterceptor的使用

转载 2015年11月18日 10:49:23

HandlerInterceptor翻译过来就是spring拦截器,它在某些功能应用上特别有用:

1. 用户是否登陆以及用户权限管理 (见http://www.ideawu.net/ideablog/category4/article174.html

2. 根据用户的选择来决定是用HTML还是用Excel来作为View (该应用后面会讲解)

3. blackboard building block的应用:在每一个controller之前都要生成context,在render view之后都要release context

 

HandlerInterceptor接口有几个重要的方法:

preHandleAction(ActionRequest request, ActionResponse response, Object handler):

该方法会在Controller的方法执行前会被调用,可以使用这个方法来中断或者继续执行链的处理,当返回true时,处理执行链会继续,当返回false时,则不会去执行Controller的方法。(验证用户是否登陆就是使用preHandleAction方法的最好例子)

afterActionCompletion(ActionRequest request, ActionResponse response, Object handler, Exception ex)

preHandleRender(RenderRequest request, RenderResponse response, Object handler)

postHandleRender(RenderRequest request, RenderResponse response, Object handler, ModelAndView modelAndView)

这3个方法会在在controller的方法执行之后,在DispatcherServlet类导向到view进行render之前依次执行。最有用的是使用postHandleRender方法,因为它有ModelAndView 传进来,那么我们就可以在render view之前往view中添加额外的model对象,或者对view的去处进行修改例如下面的“用HTML还是用Excel来作为View ”例子就是对view进行了更改

afterRenderCompletion(RenderRequest request, RenderResponse response, Object handler, Exception ex)

该方法会在render view完成后执行,也可以说在请求过程(request processing)完成之后执行。该方法可以用来清理资源(例如象blackboard building block release context)

 

总结一下HandlerInterceptor的流程

  1. (DispatcherServlet maps a request to particular handler and assembles a handler execution chain consisting of the handler that is to be invoked and all of the HandlerInterceptor instances that apply to the request.)
  2. preHandleAction(..) is called; if the invocation of this method returns true then this workflow continues
  3. The target handler handles the action phase of the request (via HandlerAdapter.handleAction(..))
  4. afterActionCompletion(..) is called
  5. preHandleRender(..) is called; if the invocation of this method returns true then this workflow continues
  6. The target handler handles the render phase of the request (via HandlerAdapter.handleRender(..))
  7. postHandleRender(..) is called
  8. afterRenderCompletion(..) is called

 

我们自己写的拦截器可以不直接实现HandlerInterceptor,而是扩展实现了HandlerInterceptor接口的具体类HandlerInterceptorAdapter,这样的话我们不需要把上面5个方法都实现,而只需要override我们需要的方法就可以了!

下面举一个使用拦截器来实现“用HTML还是用Excel来作为View ”功能的例子(只列出关键代码):

search.html:

Search for: 
  <input type="text" name="query"><br>
Output in: 
  <input type="radio name="format" value="xls"/>Excel or 
  <input type="radio" name="format" value="html"/>Html<br>
   
<input type="submit"/>
 
 SearchController.java:

protected ModelAndView handleRequestInternal(
  HttpServletRequest req, HttpServletResponse response {
   
  String query = RequestUtils.getRequiredStringParameter("query");
  List shows; // retrieve shows matching the query
   
<span style="background-color: rgb(192, 192, 192);">  ModelAndView mav = new ModelAndView("listshows", "shows", shows);</span>
  return mav;
}

OutputFormatModificationInterceptor.java:

public class OutputFormatModificationInterceptor  
<span style="color:#0000ff;">extends HandlerInterceptorAdapter</span> {
   
  private String parameter;
  private String defaultSuffix = "";
  private Properties suffices;
   
  // setters and getters omitted 
   
  public void <span style="color:#0000ff;">postHandler</span>(
    HttpServletRequest request, HttpServletResponse response, 
    Object handler, <span style="color:#0000ff;">ModelAndView mav</span>) throws Exception {
   
    String format = request.getParameter("format");
    String suffix = suffices.getProperty(format);
    // modify view name if exists 
    if (suffix != null) {
      <span style="color:#ff0000;">mav.setViewName(mav.getViewName() + suffix);</span> <span style="color:#0000ff;"><strong>//修改view达到使用不同的output格式的目的</strong></span>
    } else {
      mav.setViewName(mav.getViewName() + defaultSuffix);
  }
}<a target=_blank name="1145" style="color: rgb(51, 102, 153);"></a><a target=_blank name="beginpage." style="color: rgb(51, 102, 153);"></a>

configure xml file:

 

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
       <property name="interceptors">
              <list>
                     <ref bean="formatInterceptor"/>
              </list>
       </property>
</bean>
 
<bean id="formatInterceptor" class="org.springframework.prospring.web.OutputFormatModificationInterceptor">
       <property name="suffices">
              <props>
                     <entry key="xls">-xls</entry>
                     <entry key="html">-html</entry>
              </props>
       </property>
 
       <property name="parameter"><value>format</value></property>
       <property name="defaultSuffix"><value>-html</value></property>
</bean>
 
<bean name="/listShows.action" class="org.springframework.prospring.web.controller.ListShowsController">
... 
</bean>
 
 
 
那么在blackboard building block里可以使用下面的代码:
 
public class BbContextInterceptor extends HandlerInterceptorAdapter {
    public boolean preHandle(HttpServletRequest request,
           HttpServletResponse response, Object handler)
throws Exception {
       Context ctx = BbServiceManager.getContextManager().setContext(request);
       request.setAttribute(requestAttributeKeyForBbContext, ctx);
      
       //check user is login or not is admin or not. if not, return false
      
       return true;
    }
 
    public void afterCompletion(HttpServletRequest request,
           HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
       request.removeAttribute(requestAttributeKeyForBbContext);
       BbServiceManager.getContextManager().purgeContext();
    }
}

相关文章推荐

springMVC:HandlerInterceptor拦截器的使用

1.使用背景Web项目中需要判断http接口用户Post上来的数据是否合法,如果不合法要另做处理,用户Post上来的数据是Json形式的,我们用了@RequestBody标记自动将json形式的提交封...
  • sunp823
  • sunp823
  • 2016年06月16日 21:08
  • 12265

interceptor和filter的区别

interceptor和filter的区别 一、filter基于filter接口中的doFilter回调函数,interceptor则基于Java本身的反射机制; public class Che...

基于Spring HandlerInterceptor和Google RateLimiter 的简单throttling

spring mvc throttling

Guava RateLimiter在Web应用中的使用

Google的Guava中RateLimiter实现限流

谈谈spring中的拦截器interceptor

谈谈spring中的拦截器interceptor 在web开发中,拦截器是经常用到的功能。它可以帮我们验证是否登陆、预先设置数据以及统计方法的执行效率等等。今天就来详细的谈一下spring中的拦截器。...

Spring方法拦截器MethodInterceptor

实现MethodInterceptor 接口,在调用目标对象的方法时,就可以实现在调用方法之前、调用方法过程中、调用方法之后对其进行控制。MethodInterceptor 接口可以实现Metho...

spring mvc 拦截器 HandlerInterceptor 的使用

在进行登录操作时我们都要使用拦截器拦截用户的访问,以避免用户未登录操作。 以下是对登录操作的简单拦截,自己可针对自己的业务进行扩展。 自定义BaseInterceptor实现Han...

Spring MVC 拦截器(HandlerInterceptor)使用

最近需要画UML图,从网上找了几个工具软件,比较之后发现StarUML 2 很不错,支持UML 2.0。 StarUML 2 is compatible with UML 2.x standard...
  • FX_SKY
  • FX_SKY
  • 2017年02月28日 16:39
  • 1033

Spring 拦截器——HandlerInterceptor

介绍Spring拦截器——HandlerInterceptor的简单使用。采用注解的方式。

Spring MVC HandlerInterceptor 实现原理(源码)

上一篇文章中介绍了 Spring MVC HandlerInterceptor的使用和应用场景,本篇中我们将结合Spring MVC 源码来研究一下其内部实现。本文分析使用Spring Framewo...
  • FX_SKY
  • FX_SKY
  • 2017年04月06日 00:33
  • 472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring HandlerInterceptor的使用
举报原因:
原因补充:

(最多只允许输入30个字)