【SpringBoot】十八、拦截器 interceptor
拦截器的特性
- 拦截器可以拦截controller请求
- 拦截器可以中断请求轨迹
- 请求之前如果该请求配置了拦截器,则请求会先经过拦截器,拦截器放行之后执行请求的controller,controller执行完成之后会回到拦截器继续执行拦截器中的代码
拦截器开发
1、编写拦截器类,实现 HandlerInterceptor 接口
preHandler 预先处理方法 最先执行方法 返回值:布尔类型 true 放行请求 false 中断
postHandler 过程中处理: controller返回之后回到posthandler这个方法执行,执行完成这个方法开始响应浏览器
afterCompletion 最后完成:响应结束之后会执行拦截器中的这个方法
下面我写了两个拦截器
package com.peko.interceptor.interceptor;import com.peko.interceptor.controller.MyController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author Peko*/
public class MyInterceptor1 implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(MyController.class);/**** @param request* @param response* @param handler 当前请求的控制器的方法对象* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.info("=========1========");//true 放行 false 中断return true;}/**** @param request* @param response* @param handler 当前请求的控制器的方法对象* @param modelAndView 模型和视图 当前请求访问方法的modelandview* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {logger.info("=========2========");}/*** 这个方法相当于 finally{}代码块,即无论请求是否有问题都会执行* @param request* @param response* @param handler 当前请求的控制器的方法对象* @param ex 如果控制器出现异常时异常对象* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {logger.info("=========3========");}
}
package com.peko.interceptor.interceptor;import com.peko.interceptor.controller.MyController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author Peko*/
public class MyInterceptor2 implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(MyController.class);/**** @param request* @param response* @param handler 当前请求的控制器的方法对象* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.info("=========4========");//true 放行 false 中断return true;}/**** @param request* @param response* @param handler 当前请求的控制器的方法对象* @param modelAndView 模型和视图 当前请求访问方法的modelandview* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {logger.info("=========5========");}/*** 这个方法相当于 finally{}代码块,即无论请求是否有问题都会执行* @param request* @param response* @param handler 当前请求的控制器的方法对象* @param ex 如果控制器出现异常时异常对象* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {logger.info("=========6========");}
}
2、配置拦截器,实现 WebMvcConfigurer接口
类 implements WebMvcConfigurer{//覆盖配置拦截器方法1.使用哪个拦截器2.拦截器拦截请求3.排除哪些请求}
package com.peko.interceptor.config;import com.peko.interceptor.interceptor.MyInterceptor1;
import com.peko.interceptor.interceptor.MyInterceptor2;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author Peko*/
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor1()) //指定拦截器.addPathPatterns("/**") //拦截所有.order(1); //指定拦截器执行顺序registry.addInterceptor(new MyInterceptor2()) //指定拦截器.addPathPatterns("/**") //拦截所有.order(2); //指定拦截器执行顺序}
}
3、Controller
package com.peko.interceptor.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author Peko*/
@RestController
@RequestMapping("demo")
public class MyController {private static final Logger logger = LoggerFactory.getLogger(MyController.class);@RequestMapping("demo")public String demo(){logger.info("OK!11");return "OK!";}
}
4、运行项目,访问 http://localhost:8082/demo/demo,打印日志
2021-10-08 17:46:49.782 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========1========
2021-10-08 17:46:49.782 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========4========
2021-10-08 17:46:49.782 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : OK!11
2021-10-08 17:46:49.783 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========5========
2021-10-08 17:46:49.784 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========2========
2021-10-08 17:46:49.784 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========6========
2021-10-08 17:46:49.784 INFO 6796 --- [nio-8082-exec-4] c.p.interceptor.controller.MyController : =========3========
多个拦截器的执行顺序
当配置了多个拦截器时,多个拦截器会以栈的方式执行
例如:现在配置了两个拦截器 1-preHandle1、2-postHandle1、3-afterCompletion1 4-preHandle2、5-postHandle2、6-afterCompletion2
则执行顺序威: 1 4 5 2 6 3
gitee项目地址:https://gitee.com/ShyHour/interceptor
【SpringBoot】十八、拦截器 interceptor相关推荐
- springboot中的拦截器interceptor和过滤器filter,多次获取request参数
大家好,我是烤鸭: 这是一篇关于springboot的拦截器(interceptor)和过滤器(Filter). 先说一下过滤器和拦截器. 区别: 1. servlet请求,顺序:Filter ...
- (十六)ATP应用测试平台——java应用中的过滤器Filter、拦截器Interceptor、参数解析器Resolver、Aop切面,你会了吗?
前言 过滤器Filter.拦截器Interceptor.参数解析器Resolver.Aop切面是我们应用开发中经常使用到的技术,到底该如何使用这些web附属功能, 本小节我们就分别介绍一下其各自的用法 ...
- Resultful API的拦截(拦截器——Interceptor)
目录 一.Resultful API的拦截三种方式 二.拦截器(Interceptor)的演示示例(springboot项目) 三.Interceptor拦截器特点 四.Filter过滤器.Inter ...
- springboot 自定义注解拦截器
springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...
- SpringBoot中配置拦截器时,跨域失效
SpringBoot中配置拦截器时,跨域失效 前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求. @Con ...
- 从零开始SpringCloud Alibaba实战(59)——过滤器filter、拦截器interceptor、和AOP的区别与联系及应用
文章目录 前言 过滤器 拦截器 过滤器与拦截器的区别 AOP(面向切面) 三者使用场景 Filter过滤器 Interceptor拦截器 Spring AOP拦截器 Filter与Intercepto ...
- OKHttp拦截器(Interceptor)
一.拦截器一般作用 <1> URL重定向. <2> 请求体数据加密. <3> HEAD动态添加. <4> 请求日志抓取. 二.基础讲解 <1> ...
- spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解
springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...
- Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行
在AbstractConfigurationProvider类中loadSources方法会将所有的source进行封装成SourceRunner放到了Map<String, SourceRun ...
- Struts2拦截器(Interceptor)原理详解
1. 理解拦截器 1.1. 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作 ...
最新文章
- mysql中有哪些数值型函数_mysql数值型函数汇总
- 实现俄罗斯方块遇到的问题及游戏下载
- 再降64%,3.5M超轻量中英文OCR模型开源,身量缩减效果提升v4.1
- 【RK3399Pro学习笔记】十六、ROS中的常用可视化工具
- demo_ajax_json.js,ajax小demo-----ajax中json的使用
- oracle连续状态相同,数据库共有三种状态:quiesce、resrict、suspend
- HTML5手机游戏将迎美好未来 .
- 小牛uqi几个版本区别_川崎ZX25R便宜版本长这样?
- Swagger2+Apizza接口文档
- CSS世界Bug般的存在——字母x与“居中”
- [Android] 百度地图API Android相关配置教程(包含获取包名、发布版SHA1和开发版SHA1)
- python爬虫登录微博_[突如其来]python爬虫模拟登录微博
- NXP KV10 FTM fault功能的配置
- 弘辽科技:淘宝新店扶持是人人享有的权益吗?
- 微信小程序map组件点聚合初次使用的坑
- c语言组播源码_CLAA Class C简单组播业务的实现
- JavaScript实现手机震动效果
- 入行数据分析要知道什么是统计
- 数据大屏可视化-highcharts-3D实心饼图
- 【微信小程序】版本更新提示