本文说下spring MVC中的拦截器

文章目录

  • 拦截器介绍
  • 拦截器注入适配器
  • 自定义拦截器
  • controller测试
  • 测试结果
  • 本文小结

拦截器介绍

拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。

SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,都可以实现拦截器的定义。然后将自己定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面我们来看看如何完成。


拦截器注入适配器

package cn.wideth.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 拦截器配置类*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//  /**表示拦截所有的路径registry.addInterceptor(new MyInterceptor01()).addPathPatterns("/**").excludePathPatterns("/api/interceptor/test");;registry.addInterceptor(new MyInterceptor02()).addPathPatterns("/**").excludePathPatterns("/api/interceptor/test");}
}

代码说明:

1.通过实现WebMvcConfigurer接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已经是过时的方法了。
2.重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
3.addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
4.excludePathPatterns是配置不需要拦截的路径。
5.需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行


自定义拦截器

此处自定义了两个拦截器

package cn.wideth.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor01 implements HandlerInterceptor {/*** 执行时机:在我们编写的处理器(控制器)工作之前执行 xxx 任务. * 使用场景:一般进行用户身份校验,看用户是否具有某些权限.** 方法返回值: * true:不进行拦截,执行完该拦截器的工作之后,会进入到下一个拦截器或者处理器;** false:进行拦截,不放行,后面的拦截器或者处理器都不能工作了.** 执行顺序:首先执行该方法,该方法的执行顺序与注册顺序正相关,注册的早,就执行的 早!**/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("1.MyInterceptor01--->preHandle()方法执行了...");return true;}/*** modelAndView:来自于处理器适配器从 Handler 身上解析出来的对象.** 执行时机:是在处理器适配器已经处理完我们自己编写的处理器/控制器之后,返回 ModelAndView 之前工作的.** 使用场景:一般是对 ModelAndView 进行进一步的统一的修改/处理.** 执行顺序:执行顺序与注册顺序逆相关,注册的越早,执行的越晚! */@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("5.MyInterceptor01--->postHandle()方法执行了...");}/*** 执行时机: 当 ModelAndView 成功的送达 DispatcherServlet 后,开始执行该方法. * 使用场景:一般在该方法中对整个请求过程中产生的异常信息进行整理收集,或者进 行日志的采集.** 执行顺序:执行顺序与注册顺序逆相关,注册的越早,执行的越晚!** 注意:afterCompletion 方法的执行与否,取决于 preHandle()是否成功的执行,且返回值 为 true!*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("7.MyInterceptor01--->afterCompletion()方法执行了...");}}
package cn.wideth.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor02 implements HandlerInterceptor {/*** 执行时机:在我们编写的处理器(控制器)工作之前执行 xxx 任务.** 使用场景:一般进行用户身份校验,看用户是否具有某些权限.** 方法返回值: * true:不进行拦截,执行完该拦截器的工作之后,会进入到下一个拦截器或者处理器;** false:进行拦截,不放行,后面的拦截器或者处理器都不能工作了. * 执行顺序:首先执行该方法... */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("2.MyInterceptor02--->preHandle()方法执行了...");return true;}/*** modelAndView:来自于处理器适配器从 Handler 身上解析出来的对象.** 执行时机:是在处理器适配器已经处理完我们自己编写的处理器/控制器之后,返回 ModelAndView 之前工作的.** 使用场景:一般是对 ModelAndView 进行进一步的统一的修改/处理. */@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("4.MyInterceptor02--->postHandle()方法执行了...");}/*** 执行时机: 当 ModelAndView 成功的送达 DispatcherServlet 后,开始执行该方法.** 使用场景:一般在该方法中对整个请求过程中产生的异常信息进行整理收集,或者进 行日志的采集. */@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("6.MyInterceptor02--->afterCompletion()方法执行了...");}}

代码说明:

1.自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
2.重写三个方法,当然也可以只实现一个最重要的preHandle方法。
3.preHandle方法:此方法会在进入controller之前执行,返回Boolean值决定是否执行后续操作。
4.postHandle方法:此方法将在controller执行之后执行,但是视图还没有解析,可向ModelAndView中添加数据(前后端不分离的)。
5.afterCompletion方法:该方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。

preHandle方法,postHandle方法,afterCompletion方法的执行时机


controller测试

package cn.wideth.controller;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/api/interceptor")
@Api(description = "拦截器测试接口",tags = "Interceptor")
public class IndexController {/*** 该接口会被拦截* @return*/@GetMapping("/verify")@ApiOperation(value = "拦截器测试接口",notes = "拦截器测试接口")public String show() {System.out.println("3.Controller 被执行了...");return "index";}/*** 该接口不会被拦截* @return*/@GetMapping("/test")@ApiOperation(value = "拦截器测试接口",notes = "拦截器测试接口")public String show2() {System.out.println("3.Controller 被执行了...");return "index";}}

测试结果

不被拦截


会被拦截



本文小结

按照拦截器注入的顺序,拦截器的执行顺序应该是一下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion

spring mvc中的拦截器相关推荐

  1. Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

    转载自 https://www.cnblogs.com/EasonJim/p/7704740.html 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...

  2. Spring mvc中自定义拦截器

    一.要实现的一个功能: 1.打开特定的一些页面时必需强制用户进行登录. 2.登录后再返回到之前的页面. 二.先写一个service,实现从cookie中判断用户是否登录. 1.TT_TOKEN为登录成 ...

  3. jsp中的url拼接的参数传递到controller乱码_Spring MVC中的拦截器

    拦截器是 AOP 编程思想的典型应用 详述 Spring MVC 框架中拦截器 Interceptor 的使用方法​blog.csdn.net 实现 1:创建一个controller类 package ...

  4. 拦截webapp下jsp_Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

    I分享永久IDEA激活码:ntelliJ IDEA 2020.1.2 激活码,永久有效(点击该链接)! 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...

  5. 【Spring MVC】自定义拦截器 Interceptor

    一.自定义拦截器 1.拦截器,跟过滤器比较像的技术. 1.1 拦截器和过滤器的区别: 拦截器只能拦Controller,Filter可以拦任何请求 因为Spring的入口是dispatcherServ ...

  6. spring MVC - Inteceptors(拦截器)

    Spring的Interceptor(拦截器)是Controller 方法级别的 当某一个Controller的方法进行request处理的时候 可以通过Interceptor进行拦截, 拦截器可以在 ...

  7. Spring MVC 学习 之 - 拦截器

    public class GlobalInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRe ...

  8. vue面向切面_vue:在路由跳转中使用拦截器

    1:首先在路由对象中的某一个具体的路由对象加这样一个属性 meta: {  requireAuth:true  } 2:然后在main.js中添加这段代码 router.beforeEach((to, ...

  9. SpringMVC中的拦截器

    SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...

最新文章

  1. 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)
  2. 计算机语言是人们设计用于人与计算机交互,计算机语言是人们设计的用于人与计算机交互,计算机能够______与执行的一套规约和语法的集...
  3. support mobile touch event
  4. mysql数据库三大引擎优缺点
  5. 爬虫 404 try_Python爬虫MOOC笔记
  6. 微机笔记3——汇编语言程序设计
  7. 一名计算机专业新生代农民工的五年求学之路,从“低谷”到“山峰”
  8. Python的操作符?
  9. Shell 神技:掩盖 Linux 服务器上的操作痕迹
  10. 【笔记】vim如何删除重复行
  11. 外星人双系统ubuntu18.04安装killer E3100网卡驱动
  12. u盘稳定测试软件,u盘检测工具最新版
  13. 安徽自招计算机基础考试试题,点划自招|东南大学、中国药大2017年自主招生考情揭秘,附真题。...
  14. 利用Python进行股票交易分析(三):A股量化交易策略的验证及数据分析。
  15. 鼠标悬停出现遮罩或图片放大效果
  16. eNSP搭建路由两侧客户PC端,打通链接,路由及客户PC里面的配置信息
  17. 图匹配(Graph Matching)入门学习笔记——以《Factorized Graph Matching》为例(一)
  18. 店铺推广前准备工作有哪些?
  19. 基于启发式搜索的一字棋
  20. UDP 端口扫描 - Nmap

热门文章

  1. L2-007. 家庭房产
  2. 第四次作业——测试作业
  3. php设计模式之单例模式 1
  4. menu---A.2-基本算法实例
  5. @NotBlank注解地正确使用
  6. 确保帐户安全 谈MySQL数据库安全解决方案
  7. Java可变参数 Python可变参数 Scala可变参数
  8. WIN版的Jenkins Master加入LINUX的SLAVE节点,并作C++程序的集成交付
  9. 二叉树 根据前序遍历 中序遍历 写出后序遍历
  10. Linux中用户的简介与管理