`
m635674608
  • 浏览: 5031328 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring HandlerInterceptor的使用

 
阅读更多

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
   
  ModelAndView mav = new ModelAndView("listshows", "shows", shows);
  return mav;
}

OutputFormatModificationInterceptor.java:

public class OutputFormatModificationInterceptor  
extends HandlerInterceptorAdapter {
   
  private String parameter;
  private String defaultSuffix = "";
  private Properties suffices;
   
  // setters and getters omitted 
   
  public void postHandler(
    HttpServletRequest request, HttpServletResponse response, 
    Object handler, ModelAndView mav) throws Exception {
   
    String format = request.getParameter("format");
    String suffix = suffices.getProperty(format);
    // modify view name if exists 
    if (suffix != null) {
      mav.setViewName(mav.getViewName() + suffix); //修改view达到使用不同的output格式的目的
    } else {
      mav.setViewName(mav.getViewName() + defaultSuffix);
  }
}

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();
    }
}
 
http://blog.csdn.net/totogogo/article/details/1625824
 
 
http://zachary-guo.iteye.com/blog/1306578
分享到:
评论

相关推荐

    22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    在Spring Boot框架中,拦截器(HandlerInterceptor)是一种强大的机制,用于在请求处理前后执行自定义逻辑。在本文中,我们将深入探讨Spring Boot中的拦截器,了解其工作原理、如何实现以及实际应用。 首先,Spring...

    使用Spring MVC拦截器实现日志记录的方法

    首先,要实现一个日志记录的拦截器,需要定义一个类实现`org.springframework.web.servlet.HandlerInterceptor`接口。在这个接口中,定义了三个主要的方法,分别是`preHandle`、`postHandle`和`afterCompletion`。 ...

    从零开始学Spring Boot

    1.25 Spring Boot 拦截器HandlerInterceptor 1.26 Spring Boot启动加载数据CommandLineRunner 1.27 Spring Boot环境变量读取和属性对象的绑定 1.28 Spring Boot使用自定义的properties 1.29 改变自动扫描的包 1.30 ...

    Spring拦截器HandlerInterceptor接口代码解析

    Spring拦截器HandlerInterceptor接口代码解析 Spring拦截器HandlerInterceptor接口代码解析是Spring框架中的一种重要机制,它允许开发者在请求处理过程中执行自定义逻辑,以达到验证、日志记录、性能监控、安全检查...

    springMVC拦截器HandlerInterceptor用法代码示例

    import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class ControlInterceptor implements HandlerInterceptor { private Logger logger ...

    dynamic-datasource-spring-boot-starter_多数据源_

    其内部可能包括了数据源配置、路由策略、切换逻辑等组件,通过Spring Boot的自动配置能力,使得开发者可以方便地在项目中集成和使用。 使用这个启动器,开发者可以自定义数据源的配置,例如设置数据源的类型(如...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    spring第11章--ajax,上传下载,拦截器.rar_spring mvc_spring 下载_spring 使用ajax

    本章将探讨如何在Spring MVC中集成和使用Ajax,以及涉及的上传和下载功能,同时还会介绍Spring MVC中的拦截器。 1. **Spring MVC与Ajax交互**: - **jQuery Ajax**:Spring MVC常与jQuery库结合使用,通过$.ajax()...

    Spring MVC Locale 的使用 中文 英文 等语言 切换

    为了在视图层显示这些本地化信息,我们可以在JSP页面中使用Spring的`fmt`标签库: ```jsp ${pageContext.request.locale}" /&gt; ``` `fmt:setLocale`标签用于设置当前页面的`Locale`,`fmt:message`则用于获取并...

    Spring 2.0 开发参考手册

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    在项目中,它可能负责定义如何使用JPA来操作用户角色和权限数据,以及如何配置SpringSecurity的过滤规则。 在实际的实现过程中,开发者首先会创建一个用户实体(User),并关联角色实体(Role)。每个角色都有多个...

    Mastering Spring MVC 4(2015.09)源码

    通过实现HandlerInterceptor接口或使用@Interceptor注解,开发者可以添加全局的行为,如日志记录、权限检查等。 此外,Spring MVC 4还支持RESTful风格的Web服务,通过@RequestMapping注解的produces和consumes属性...

    Spring Boot 学习笔记完整教程.pdf

    - **拦截器 HandlerInterceptor**:Spring MVC 提供了 HandlerInterceptor 接口,用于拦截请求并进行预处理或后处理。 - **系统启动任务 CommandLineRunner**:可以实现 CommandLineRunner 接口,在 Spring Boot ...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `postHandle()`, 和 `afterCompletion()` 来创建自定义的拦截器。 `preHandle()` 方法在目标处理方法调用之前执行...

    spring mvc jar包

    4. `org.springframework.web-3.0.2.RELEASE.jar`:这个库包含了一些 Web 相关的支持类,如 Web 应用上下文(WebApplicationContext)、HTTP 拦截器(HandlerInterceptor)和请求映射(RequestMapping)等,它们与 ...

    Spring MVC 学习记录总结1

    Spring MVC 是一个广泛使用的 Java Web 开发框架,它实现了MVC(Model-View-Controller)设计模式,使得开发者可以更高效地构建可维护且松耦合的Web应用程序。在这个学习记录总结中,我们将深入理解Spring MVC的核心...

    Spring MVC 4.2.4.RELEASE 中文文档

    使用 HandlerInterceptor 拦截请求可以提供一个灵活的方式来在请求处理之前和之后执行自定义的行为。ViewResolver 接口是用于解析视图名称到实际的视图对象。 内容协商解析器 ContentNegotiatingViewResolver 允许...

    spring chm文档

    Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack ...19.2. 使用Spring JMS ...

Global site tag (gtag.js) - Google Analytics