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

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

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

[java] view plaincopy
  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开放,那么就可以使用拦截器实现这个功能。

[java] view plaincopy
  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配置:

[html] view plaincopy
  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:

[java] view plaincopy
  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

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

转载于:https://www.cnblogs.com/davidwang456/p/4511025.html

Spring MVC 中 HandlerInterceptorAdapter的使用--转载相关推荐

  1. Spring MVC 中 HandlerInterceptorAdapter的使用(拦截器)

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

  2. Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

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

  3. Spring MVC 中 HandlerInterceptorAdapter的使用

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

  4. Spring MVC 中 HandlerInterceptorAdapter的使用 预处理、后处理、返回处理

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

  5. 【Spring MVC 中 HandlerInterceptorAdapter的使用】

    接到这样一个需求:现有项目X,在我方的服务器A和客户的服务器B上均有部署.用户之前都是访问的A,现在要求所有用户的请求都转发到服务器B上去.考虑到用户可能保存了很多不同的网址(不止是主页网址),现写一 ...

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

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

  7. Spring MVC 中的 forward 和 redirect

    Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染.假设逻辑视图名为 hello,通过配置,我们配置某个 ViewRes ...

  8. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--><context-param><param-name>webAp ...

  9. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

最新文章

  1. linux网络管理原理,Linux__网络管理(物理层 数据链路层 网络层工作原理)
  2. ASP.NET XML Web 服务的工作流解决方案
  3. 浅谈手机网站优化的需要注意哪些事项?
  4. 用gdb调试core文件
  5. python 关键字大全_一日一技:用实例列举python中所有的关键字(01)
  6. vector容器中重写sort方法
  7. java如何避免注释重复_Java 8中的可重复注释
  8. const 常量_条款03:尽可能使用const
  9. linux 有趣的命令
  10. python读取文件夹下所有文件的名称_python2.7 学习之读取文件夹下所有文件名称及内容...
  11. ArrayBuffer和TypedArray,以及Blob的使用
  12. SQL Server跨server之间訪问
  13. UVa 674 - Coin Change
  14. Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
  15. 下列c语言表达式正确,C语言试题-10(含答案
  16. 阿里云吴磊创办yunQ云桥,完成银杏谷资本2000万元天使轮融资...
  17. foxmail 登陆gmail报密码错误
  18. LintCode 158. 两个字符串是变位词 JavaScript算法
  19. 新型城镇化提质扩容 打造民村智慧城市
  20. 如何在 Titanic Kaggle Challenge 中获得0.8134分

热门文章

  1. oracle如何启动和停止服务,CentOS启动和停止服务详解
  2. jquery mobile快速入门_【K些项目】学透jquery,11个国内最新项目资料
  3. c语言中指针的类型,学习C语言中的指针类型
  4. file 选择的文件胖多有多大_「HTML5 进阶」FileAPI 文件操作实战,内附详细案例,建议收藏...
  5. 生产事故 java_记一次生产事故:30万单就这样没了!
  6. linux root登陆ftp,LINUX服务器下用root登录ftp
  7. 虚拟环境是什么意思?pycharm的工程文件下的各个文件是什么意思以及pycharm的使用,run\debug configuration的配置,pycharm的常用快捷键
  8. 64位操作系统的原理
  9. dailykt爬取tushare 数据存入本地mysql
  10. 54. Leetcode 113. 路径总和 II (二叉树-二叉树路径和)