Spring MVC拦截器示例

我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具。

Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截,或者相反,在其离开您的控制器之后但在将其反馈给浏览器之前,对其进行拦截。

您可能会问这对您有什么用? 答案是,它允许您执行每个请求或一组请求共有的任务,而无需将“ n”粘贴样板代码切成每个控制器类。 例如,您可以在请求到达控制器之前执行用户身份验证,如果成功,则从数据库中检索一些其他用户详细信息,然后在调用控制器之前将其添加到HttpServletRequest对象。 然后,您的控制器可以简单地检索和使用这些值,或将其留给JSP显示。 另一方面,如果身份验证失败,则可以将用户重定向到其他页面。

演示代码向您展示如何在传入的HttpServletRequest对象到达控制器之前对其进行修改。 这无非是向请求中添加一个简单的字符串,但是,正如我上面所说,您始终可以进行数据库调用来获取每个请求所需的一些数据……您甚至可以添加某种优化并进行一些处理此时进行缓存。

public class RequestInitializeInterceptor extends HandlerInterceptorAdapter {

  // Obtain a suitable logger.
  private static Log logger = LogFactory
      .getLog(RequestInitializeInterceptor.class);

  /**
   * In this case intercept the request BEFORE it reaches the controller
   */
  @Override
  public boolean preHandle(HttpServletRequest request,
      HttpServletResponse response, Object handler) throws Exception {
    try {

      logger.info("Intercepting: " + request.getRequestURI());

      // Do some changes to the incoming request object
      updateRequest(request);

      return true;
    } catch (SystemException e) {
      logger.info("request update failed");
      return false;
    }
  }

  /**
   * The data added to the request would most likely come from a database
   */
  private void updateRequest(HttpServletRequest request) {

    logger.info("Updating request object");
    request.setAttribute("commonData",
        "This string is required in every request");
  }

  /** This could be any exception */
  private class SystemException extends RuntimeException {

    private static final long serialVersionUID = 1L;
    // Blank
  }
}

在上面的代码中,我通过扩展HandlerInterceptorAdaptor类(覆盖preHandle(..)方法)选择了最简单的实现方法。 我的preHandle(...)方法进行错误处理,确定发生错误时的处理方法,如果发生错误则返回false。 返回false时,拦截器链会断开,并且不会调用您的控制器类。 与请求对象混淆的实际事务被委托给updateRequest(request)。

HandlerInterceptorAdaptor类具有三个方法,每个方法都被存根,如果需要,可以忽略。 这些方法是:prehandle(…),postHandle(…)和afterCompletion(…),有关这些的更多信息可以在Spring API文档中找到 。 请注意,这可能会造成一些混乱,因为Handler Interceptor类文档仍通过它们的Spring 2处理程序名称来引用MVC控制器类。 如果您查看prehandle(…)的Object类型的第三个参数(称为处理程序),则很容易证明这一点。 如果在调试器中进行检查,您将看到它是控制器类的实例。 如果您不熟悉这项技术,请记住该控制器==处理程序。

与往常一样,实现拦截器的下一步是向Spring XML配置文件中添加一些内容:

<!-- Configures Handler Interceptors --> 
<mvc:interceptors>  
 <!-- This bit of XML will intercept all URLs - which is what you want in a web app -->
 <bean class="marin.interceptor.RequestInitializeInterceptor" />
 
 <!-- This bit of XML will apply certain URLs to certain interceptors -->
 <!-- 
 <mvc:interceptor>
  <mvc:mapping path="/gb/shop/**"/>
  <bean class="marin.interceptor.RequestInitializeInterceptor" />
 </mvc:interceptor>
  -->
</mvc:interceptors>

上面的XML演示了向所有请求URL添加拦截器的一种或一种选择,或者如果您查看注释掉的部分,则向特定的请求URL添加拦截器,从而允许您选择将哪些URL连接到您的拦截器类。

鹰眼的读者可能已经注意到,拦截器类使用继承和XML配置作为其实现方法。 在配置方面的常规情况下,这种模式看起来有些疲惫,并且可能需要进行大修。 一种建议是使用已添加到控制器机制中的相同技术来增强整体以使用注释。 这将增加额外的灵活性,而不会导致使用所有接口和抽象基类的复杂性。 作为建议,将来的拦截器类实现可能如下所示:

@Intercept(value = "/gb/en/*", method = RequestMethod.POST)
  public boolean myAuthenticationHandler(HttpServletRequest request,
      Model model) {
    // Put some code here
  }

这样就结束了对Spring拦截器的了解,应该记住,我只是展示了最基本的实现。

参考:来自Captain Debug博客的 JCG合作伙伴 Roger Hughes在MVC Webapp中使用Spring Interceptor

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值