Spring拦截器配置详解(如何定义一个拦截器)
一、前言
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拦截器配置详解(如何定义一个拦截器)相关推荐
- SpringBoot配置文件中spring.profiles.active配置详解
SpringBoot配置文件中spring.profiles.active配置详解 1.多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测 ...
- python3多行输入字符串_详解Python3 定义一个跨越多行的字符串的多种方法
方法一:使用三引号 >>> str1 = '''Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存. (纵有疾风起,人生不言弃. ...
- Spring Boot Logback 配置详解
1.Logback简介 Logback是由log4j创始人设计的又一个开源日志组件. 相比于log4j,Logback重写了内核,在一些关键执行路径上性能提升10倍以上.而且logback不仅性能提升 ...
- Spring Hibernate Mybatis配置详解
2019独角兽企业重金招聘Python工程师标准>>> 1. Spring + Hibernate4(spring-hibernate.xml) <!-- 引入jdbc pro ...
- Windows下Solr的安装与配置,附DIH全量导入MySQL数据、IK分词器配置详解——不用集成Tomcat
Solr是Apache开源的比较稳定的一款全文搜索引擎,也是市面上相对比较流行的一款全文搜索引擎,好不好用你用过之后自有判断.今天给大家分享一下它的安装与配置,我用的是7.7.2版本.废话不多说,开搞 ...
- Spring之——c3p0配置详解
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51162560 今天,我们就来详细谈谈Spring中的c3p0配置问题,好了,不耽搁 ...
- Spring 多数据源配置详解
前言 数据源是 JDBC 规范中用来获取关系型数据库连接的一个接口,主要通过池化技术来复用连接. 简单点的 Java 项目或者拆分比较彻底的微服务模块中只会用到一个数据库实例,对应一个数据源.稍复杂点 ...
- spring security xml配置详解
security 3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns= ...
- Spring的datasource配置详解
一句话,Spring对Hibernate的整合,是在applicationContext.xml中配置sessionFactory来实现的,其中sessionFactory中要装配dataSource ...
最新文章
- Anaconda3-5.0.1 输入ipython 出现 ImportError: cannot import name ‘create_prompt_application‘
- 正则语法完全正则表达式手册_语法格式重点
- 流程图虚线箭头的意思_Ai篇NO.3: 怎样画出不死板的箭头?
- CSDN博客越来越垃圾了,到处放广告
- 学习笔记-小甲鱼Python3学习第十五讲:字符串:格式化
- 深入理解printf 之一 问题引出
- 人类一败涂地电脑版_【游戏资讯】这是PC版塞尔达?终极无敌暴力缝合怪登陆Steam!PS3模拟器更新后可流畅运行美末!...
- datagrid如何获取一行数据中的某个字段值_MySQL 如何查找删除重复行?
- python 第三课 第一个python程序
- ArrayBlockingQueue与LinkedBlockingQueue
- mysql 分组group
- 代理模式-Java实现-静态代理、动态代理
- JUC和线程池的详细讲解
- 左程云基础班——排序算法
- 理解Word2Vec模型
- “绿萌”仿“大麦”演出购票APP
- Hive内表和外表浅析
- 程序员讲装修——平台选择
- ReentrantReadWriteLock、StampedLock读写锁
- C指针之指针与数组的天生姻缘