原文地址:http://blog.csdn.net/liuwenbo0920/article/details/7283757

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  2. throws Exception {
  3. return true;
  4. }
  5. public void postHandle(
  6. HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
  7. throws Exception {
  8. }
  9. public void afterCompletion(
  10. HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  11. throws Exception {
  12. }

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 
在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。

一个demo: 
在这个例子中,我们假设UserController中的注册操作只在9:00-12:00开放,那么就可以使用拦截器实现这个功能。

  1. public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
  2. private int openingTime;
  3. private int closingTime;
  4. private String mappingURL;//利用正则映射到需要拦截的路径
  5. public void setOpeningTime(int openingTime) {
  6. this.openingTime = openingTime;
  7. }
  8. public void setClosingTime(int closingTime) {
  9. this.closingTime = closingTime;
  10. }
  11. public void setMappingURL(String mappingURL) {
  12. this.mappingURL = mappingURL;
  13. }
  14. @Override
  15. public boolean preHandle(HttpServletRequest request,
  16. HttpServletResponse response, Object handler) throws Exception {
  17. String url=request.getRequestURL().toString();
  18. if(mappingURL==null || url.matches(mappingURL)){
  19. Calendar c=Calendar.getInstance();
  20. c.setTime(new Date());
  21. int now=c.get(Calendar.HOUR_OF_DAY);
  22. if(now<openingTime || now>closingTime){
  23. request.setAttribute("msg", "注册开放时间:9:00-12:00");
  24. request.getRequestDispatcher("/msg.jsp").forward(request, response);
  25. return false;
  26. }
  27. return true;
  28. }
  29. return true;
  30. }
  31. }

xml配置:

  1. <bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">
  2. <property name="openingTime" value="9" />
  3. <property name="closingTime" value="12" />
  4. <property name="mappingURL" value=".*/user\.do\?action=reg.*" />
  5. </bean>
  6. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  7. <property name="interceptors">
  8. <list>
  9. <ref bean="timeBasedAccessInterceptor"/>
  10. </list>
  11. </property>
  12. </bean>

这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。

UserController:

  1. @Controller
  2. @RequestMapping("/user.do")
  3. public class UserController{
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping(params="action=reg")
  7. public ModelAndView reg(Users user) throws Exception {
  8. userService.addUser(user);
  9. return new ModelAndView("profile","user",user);
  10. }
  11. // other option ...
  12. }

这个Controller相当于Struts的DispatchAction

你也可以配置多个拦截器,每个拦截器进行不同的分工.

Spring MVC 中 HandlerInterceptorAdapter的使用--转载的更多相关文章

  1. Spring MVC 中 HandlerInterceptorAdapter的使用

    一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理.后处理. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. s ...

  2. Spring mvc中@RequestMapping 6个基本用法小结(转载)

    小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMapping(value="/departments" ...

  3. Spring MVC 中的基于注解的 Controller(转载)

           终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...

  4. Spring MVC 教程,快速入门,深入分析(转载)

    作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download    (本文使用是的 ...

  5. Spring MVC中各个filter的用法

    转载:http://blog.csdn.net/qyp1314/article/details/42023725 Spring MVC中各个filter的用法 2014-12-19 09:08 105 ...

  6. spring mvc中实现csrf安全防御简记

    1.csrf是什么 csrf全称是Cross-site request forgery,http://en.wikipedia.org/wiki/Csrf 危害:使受害用户在不经意间执行了不是用户意愿 ...

  7. 玩转spring mvc(四)---在spring MVC中整合JPA

    关于在Spring MVC中整合JPA是在我的上一篇关于spring mvc基本配置基础上进行的,所以大家先参考一下我的上一篇文章:http://blog.csdn.net/u012116457/ar ...

  8. Spring mvc中@RequestMapping 6个基本用法

    Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法.  1)最基本的,方法级别上应用,例如: Java代码 @Reques ...

  9. spring mvc中使用freemark的一点心得

    参考文档: FreeMarker标签与使用 连接http://blog.csdn.net/nengyu/article/details/6829244 freemarker学习笔记--指令参考: ht ...

随机推荐

  1. poj 1552 Doubles

    #include <stdio.h> #include <stdlib.h> ]; int cmp(const void *a, const void *b) { return ...

  2. 使用 XMPP 构建一个基于 web 的通知工具——转

    Inserting of file(使用 XMPP 构建一个基于 web 的通知工具.docx) failed. Please try again. http://www.ibm.com/develo ...

  3. cocos2d-x 3.2读取xml和json练习

    读取和生成xml文件: #include "tinyxml2/tinyxml2.h" using namespace tinyxml2; void HelloWorld::make ...

  4. Cocos2d-x项目移植到WP8小记

    Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...

  5. 二十八个 HTML5 特性与技巧

    1. New Doctype  你还在使用令人讨厌的难记的XHTML文档类型声明吗?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  6. vim之vba文件

    [vim之vba文件] Vimball 官方描述: The vimball plugin facilitates creating, extracting , and listing the cont ...

  7. SUSE linux ,liveUSB制作方法

    下载了ubuntu 11.04,ubuntu11.10,fedora15,kubuntu 11.04,linuxmint-11,还有suse的kde和gnome的桌面版镜像,其他的都很方便的做成了li ...

  8. How Tomcat Works(三)

    上文中描述的简单的服务器是不符合Servlet规范的,所以本文进一步描述一个简单的Servlet容器是怎么实现的 所以我们首先要明白Servlet接口规范,规范有不同版本,本人就先一视同仁了: pub ...

  9. 3.依赖倒置原则(Dependence Inversion Principle)

    1.定义 高层模块不应该依赖于低层模块,二者都应该依赖于抽象:抽象不应该依赖细节:细节应该依赖抽象. 2.定义解读 依赖倒置原则在程序编码中经常运用,其核心思想就是面向接口编程,高层模块不应该依赖低层 ...

  10. cocos2d-x如何截屏并保存图片

    转自:http://blog.csdn.net/wolfking_2009/article/details/11022693 static void ScreenShoot() { CCSize si ...