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

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

[java] view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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/lxaic/p/5851985.html

Spring MVC 中 HandlerInterceptorAdapter的使用(拦截器)相关推荐

  1. Spring MVC学习(8)—HandlerInterceptor处理器拦截器机制全解

    基于最新Spring 5.x,详细介绍了Spring MVC的HandlerInterceptor处理器拦截器机制,以及它的一系列拦截方法. 本次我们来学习Sring MVC的HandlerInter ...

  2. SSM框架之Spring MVC(四)异常处理和拦截器实现

    一.SpringMVC中的异常处理 1.1异常处理的思路 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通 ...

  3. Spring MVC 中 HandlerInterceptorAdapter的使用--转载

    原文地址:http://blog.csdn.net/liuwenbo0920/article/details/7283757 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可 ...

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

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

  5. Spring MVC 中 HandlerInterceptorAdapter的使用

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

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

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

  7. 【Spring MVC 中 HandlerInterceptorAdapter的使用】

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

  8. spring mvc中的拦截器

    本文说下spring MVC中的拦截器 文章目录 拦截器介绍 拦截器注入适配器 自定义拦截器 controller测试 测试结果 本文小结 拦截器介绍 拦截器是在servlet执行之前执行的程序(这里 ...

  9. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

最新文章

  1. jquery内核学习(6)--扩展实现extend
  2. 使用文本文件(.txt)进行数据存取的技巧总结
  3. 5G商用将在“十三五”时期内启动
  4. GridView的多主键(Key)取值问题
  5. java客户端传递参数_java – 在客户端传递参数
  6. Shell教程(五):替代、引用机制、输入输出重定向
  7. 监听Hierachy、Project等视图结构变化的事件
  8. python执行adb命令_Python实现对adb命令封装
  9. android studio butterknife配置,!!!!在AndroidStudio中添加butterknife插件
  10. PostgreSQL11.7逻辑复制的搭建
  11. 搭建mediawiki开始知识共享
  12. 换个红圈1微信头像恶搞一下好友
  13. newton版本linux,centos7.4下安装部署openstack newton版本 互联网技术圈 互联网技术圈...
  14. hdu 3930 Broot 二次剩余
  15. 论述计算机辅助设计技术主要包括的内容,计算机辅助设计复习思考题
  16. spark数据清洗解决方案
  17. 万人规模互联网公司的企业IT基础架构概览
  18. 设计模式——备份模式
  19. 点我—— ASP.NETCORE 安装CentOS
  20. 在虚拟机上使用Ghost备份/恢复操作系统

热门文章

  1. 给大家几个不花钱看书的办法【人人都是产品经理】
  2. 《吃土》全书笔记整理
  3. 脂肪粒是否可以针刺入
  4. 避免强光的一些注意点
  5. hive的静态分区与动态分区-用法实例
  6. kaggle的kernel-only比赛中出现Your Notebook cannot use internet access in this competition解决方案
  7. ubuntu Linux18.10/19.10下的护眼宝
  8. OpenGL:carmer
  9. java培训第一阶段测试总结,达内学员Java培训阶段总结:反躬自省,愈渐完美
  10. maven工程错误汇总