一、前言

Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。

二、自定义拦截器

自定义拦截器类,写一个类实现 HandlerInterceptor 接口,然后重写 里面的 preHandle()、postHandle()、afterCompletion()方法

// return  true表示放行,  return false表示拦截,不向下执行
public class Interceptor1 implements HandlerInterceptor{public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {log.info("preHandle:请求前调用");//返回 false 则请求中断//判断用户是否登陆  如果没有登陆  重定向到登陆页面   不放行   如果登陆了  就放行了String requestURI = request.getRequestURI();if(!requestURI.contains("/login")){String username = (String) request.getSession().getAttribute("USER_SESSION");if(null == username){response.sendRedirect(request.getContextPath() + "/login.action");return false;}}return true;}/** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    * 可在modelAndView中加入数据,比如当前时间 */  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView modelAndView)throws Exception {if(modelAndView != null){  //加入当前时间    modelAndView.addObject("var", "测试postHandle");    }  log.info("postHandle:请求后调用");  }/**  * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   *   * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  */    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");}}

preHandle
预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现); 
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle
后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion
整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

preHandle

  • 调用时间:Controller方法处理之前
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
  • 若返回false,则中断执行,注意:不会进入afterCompletion

postHandle

  • 调用前提:preHandle返回true
  • 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行
  • 备注:postHandle虽然post打头,但post、get方法都能处理

afterCompletion

  • 调用前提:preHandle返回true
  • 调用时间:DispatcherServlet进行视图的渲染之后
  • 多用于清理资源

三、springmvc.xml装在拦截器配置

在springmvc的xml配置文件中, 来构建拦截器, 拦截上面的controller

     <!-- Springmvc的拦截器 --><mvc:interceptors><!-- 多个拦截器 --><mvc:interceptor>  <!-- 具体匹配原则可以百度 --><!-- 对controller的请求url路径进行拦截,匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->   /**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹,不含子文件夹/是web项目的根目录 --><mvc:mapping path="/**"/><!-- 自定义的拦截器类 --><bean class="com.iss.springmvc.interceptor.Interceptor1"/></mvc:interceptor></mvc:interceptors>

四、更多好文

SpringMVC拦截器的使用详解:https://blog.csdn.net/xiaokang123456kao/article/details/72831049

Spring拦截器配置详解(如何定义一个拦截器)相关推荐

  1. SpringBoot配置文件中spring.profiles.active配置详解

    SpringBoot配置文件中spring.profiles.active配置详解 1.多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测 ...

  2. python3多行输入字符串_详解Python3 定义一个跨越多行的字符串的多种方法

    方法一:使用三引号 >>> str1 = '''Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存. (纵有疾风起,人生不言弃. ...

  3. Spring Boot Logback 配置详解

    1.Logback简介 Logback是由log4j创始人设计的又一个开源日志组件. 相比于log4j,Logback重写了内核,在一些关键执行路径上性能提升10倍以上.而且logback不仅性能提升 ...

  4. Spring Hibernate Mybatis配置详解

    2019独角兽企业重金招聘Python工程师标准>>> 1. Spring + Hibernate4(spring-hibernate.xml) <!-- 引入jdbc pro ...

  5. Windows下Solr的安装与配置,附DIH全量导入MySQL数据、IK分词器配置详解——不用集成Tomcat

    Solr是Apache开源的比较稳定的一款全文搜索引擎,也是市面上相对比较流行的一款全文搜索引擎,好不好用你用过之后自有判断.今天给大家分享一下它的安装与配置,我用的是7.7.2版本.废话不多说,开搞 ...

  6. Spring之——c3p0配置详解

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51162560 今天,我们就来详细谈谈Spring中的c3p0配置问题,好了,不耽搁 ...

  7. Spring 多数据源配置详解

    前言 数据源是 JDBC 规范中用来获取关系型数据库连接的一个接口,主要通过池化技术来复用连接. 简单点的 Java 项目或者拆分比较彻底的微服务模块中只会用到一个数据库实例,对应一个数据源.稍复杂点 ...

  8. spring security xml配置详解

    security 3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns= ...

  9. Spring的datasource配置详解

    一句话,Spring对Hibernate的整合,是在applicationContext.xml中配置sessionFactory来实现的,其中sessionFactory中要装配dataSource ...

最新文章

  1. Anaconda3-5.0.1 输入ipython 出现 ImportError: cannot import name ‘create_prompt_application‘
  2. 正则语法完全正则表达式手册_语法格式重点
  3. 流程图虚线箭头的意思_Ai篇NO.3: 怎样画出不死板的箭头?
  4. CSDN博客越来越垃圾了,到处放广告
  5. 学习笔记-小甲鱼Python3学习第十五讲:字符串:格式化
  6. 深入理解printf 之一 问题引出
  7. 人类一败涂地电脑版_【游戏资讯】这是PC版塞尔达?终极无敌暴力缝合怪登陆Steam!PS3模拟器更新后可流畅运行美末!...
  8. datagrid如何获取一行数据中的某个字段值_MySQL 如何查找删除重复行?
  9. python 第三课 第一个python程序
  10. ArrayBlockingQueue与LinkedBlockingQueue
  11. mysql 分组group
  12. 代理模式-Java实现-静态代理、动态代理
  13. JUC和线程池的详细讲解
  14. 左程云基础班——排序算法
  15. 理解Word2Vec模型
  16. “绿萌”仿“大麦”演出购票APP
  17. Hive内表和外表浅析
  18. 程序员讲装修——平台选择
  19. ReentrantReadWriteLock、StampedLock读写锁
  20. C指针之指针与数组的天生姻缘

热门文章

  1. 论文笔记(二):基于卷积神经网络的高分辨率遥感图像上的水体识别技术
  2. (五)Richardson 迭代法
  3. C#中Invoke,BeginInvoke的作用
  4. SPH算法简介(四): Hello, SPH
  5. 十大经典排序算法的动图
  6. 用户画像数据指标体系之用户属性维度
  7. idea启动报符号缺失,无法启动与构建
  8. Lieges of Legendre CodeForces - 603C (博弈论,SG找规律)
  9. 愤世嫉俗的程序员,总在某乎发表言论,当起了“键盘侠”
  10. 力扣刷题-单链表两数相加