spring mvc中的拦截器
本文说下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中的拦截器相关推荐
- Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
转载自 https://www.cnblogs.com/EasonJim/p/7704740.html 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...
- Spring mvc中自定义拦截器
一.要实现的一个功能: 1.打开特定的一些页面时必需强制用户进行登录. 2.登录后再返回到之前的页面. 二.先写一个service,实现从cookie中判断用户是否登录. 1.TT_TOKEN为登录成 ...
- jsp中的url拼接的参数传递到controller乱码_Spring MVC中的拦截器
拦截器是 AOP 编程思想的典型应用 详述 Spring MVC 框架中拦截器 Interceptor 的使用方法blog.csdn.net 实现 1:创建一个controller类 package ...
- 拦截webapp下jsp_Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
I分享永久IDEA激活码:ntelliJ IDEA 2020.1.2 激活码,永久有效(点击该链接)! 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...
- 【Spring MVC】自定义拦截器 Interceptor
一.自定义拦截器 1.拦截器,跟过滤器比较像的技术. 1.1 拦截器和过滤器的区别: 拦截器只能拦Controller,Filter可以拦任何请求 因为Spring的入口是dispatcherServ ...
- spring MVC - Inteceptors(拦截器)
Spring的Interceptor(拦截器)是Controller 方法级别的 当某一个Controller的方法进行request处理的时候 可以通过Interceptor进行拦截, 拦截器可以在 ...
- Spring MVC 学习 之 - 拦截器
public class GlobalInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRe ...
- vue面向切面_vue:在路由跳转中使用拦截器
1:首先在路由对象中的某一个具体的路由对象加这样一个属性 meta: { requireAuth:true } 2:然后在main.js中添加这段代码 router.beforeEach((to, ...
- SpringMVC中的拦截器
SpringMVC中的拦截器 拦截器的作用 Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现 ...
最新文章
- 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)
- 计算机语言是人们设计用于人与计算机交互,计算机语言是人们设计的用于人与计算机交互,计算机能够______与执行的一套规约和语法的集...
- support mobile touch event
- mysql数据库三大引擎优缺点
- 爬虫 404 try_Python爬虫MOOC笔记
- 微机笔记3——汇编语言程序设计
- 一名计算机专业新生代农民工的五年求学之路,从“低谷”到“山峰”
- Python的操作符?
- Shell 神技:掩盖 Linux 服务器上的操作痕迹
- 【笔记】vim如何删除重复行
- 外星人双系统ubuntu18.04安装killer E3100网卡驱动
- u盘稳定测试软件,u盘检测工具最新版
- 安徽自招计算机基础考试试题,点划自招|东南大学、中国药大2017年自主招生考情揭秘,附真题。...
- 利用Python进行股票交易分析(三):A股量化交易策略的验证及数据分析。
- 鼠标悬停出现遮罩或图片放大效果
- eNSP搭建路由两侧客户PC端,打通链接,路由及客户PC里面的配置信息
- 图匹配(Graph Matching)入门学习笔记——以《Factorized Graph Matching》为例(一)
- 店铺推广前准备工作有哪些?
- 基于启发式搜索的一字棋
- UDP 端口扫描 - Nmap