Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署
学习视频:【编程不良人】2021年SpringBoot最新最全教程
第十三章、拦截器

-
拦截器 :Interceptor 拦截 中断
类似于javaweb中的Filter,不过没有Filter那么强大
-
作用
Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和之后执行一些操作,例如日志记录、权限验证、数据处理等。
-
拦截器特点
- 请求到达会经过拦截器,响应回来同样会经过拦截器
- 拦截器只能Controller的请求,不能拦截jsp、静态资源相关请求
- 拦截器可以中断请求轨迹
拦截器实现
- 开发步骤
-
配置拦截器 实现
**HandlerInterceptor**,这个类通常包含**preHandle、postHandle和afterCompletion**三个方法,分别用于请求处理之前、之后以及完成后执行自定义逻辑。@Component public class MyInterceptor implements HandlerInterceptor {private final Logger log = LoggerFactory.getLogger(MyInterceptor.class);@Override//参数1:当前请求对象 参数2:当前请求响应对象 参数3:当前请求的控制器对应的方法对象public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.debug("======1========");return HandlerInterceptor.super.preHandle(request, response, handler);}@Override// 参数1、2、3同上 参数4:当前控制器方法的返回值public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.debug("======2========");log.debug("view:{}",modelAndView.getViewName());HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Override// 参数1、2、3同上 参数4:请求过程中出现异常时的异常对象// 这个方法总是会执行 无论请求正确或出现异常public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.debug("======3========");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);} } -
创建配置类,目的是将拦截器注册到程序中,在这个配置类中,你需要重写**
addInterceptors方法,并在其中将拦截器添加到InterceptorRegistry**中。@Configuration public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor)// 指定拦截器.addPathPatterns("/**")// 拦截所有.excludePathPatterns("file/**");//排除拦截} }
-
注意
多个拦截器注册到配置类中,他们的执行顺序是按照栈一样的顺序,第一个拦截器先执行,那么该拦截器也是最后退出的。秉承先进后出的原理
@Configuration public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Autowiredprivate MyInterceptor2 myInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor)// 指定拦截器.addPathPatterns("/**")// 拦截所有.excludePathPatterns("file/**");//排除拦截registry.addInterceptor(myInterceptor2)// 指定拦截器.addPathPatterns("/**")// 拦截所有.excludePathPatterns("file/**");//排除拦截} }-
执行结果

-
-
可以通过order参数修改执行顺序
@Configuration public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Autowiredprivate MyInterceptor2 myInterceptor2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor)// 指定拦截器.addPathPatterns("/**")// 拦截所有.excludePathPatterns("file/**") //排除拦截.order(2);registry.addInterceptor(myInterceptor2)// 指定拦截器.addPathPatterns("/**")// 拦截所有.excludePathPatterns("file/**")//排除拦截.order(1);} }
第十四章、项目部署
Spring Boot 项目可以通过多种方式部署:
- 传统服务器部署:将 Spring Boot 项目打包成可执行的War/ JAR 文件,然后将该 War/JAR 文件上传到服务器并运行。这种方式需要确保服务器上已经安装了 Java 运行环境。
- Docker 容器部署:将 Spring Boot 项目打包成 Docker 镜像,然后在 Docker 容器中运行该镜像。这种方式可以实现环境的快速部署和一致性。
- 云平台部署:将 Spring Boot 项目部署到云平台,比如 Heroku、Google Cloud Platform (GCP)、Amazon Web Services (AWS) 等。这些云平台提供了简单的部署流程和弹性的扩展能力。
- 自动化部署工具:使用自动化部署工具,比如 Jenkins、GitLab CI/CD 等,实现持续集成和持续部署。这种方式可以自动化构建、测试和部署 Spring Boot 项目。
目前讲的就是传统部署方式,分为两种:
- war部署(linux系统)
- 安装jdk
- 安装tomcat
- 安装数据库
- 部署项目war放到tomcat weapps
- jar部署(linux系统)
- 安装jdk
- 安装数据库
- 运行项目java-jar项目.jar
war包部署
-
目前创建springboot项目默认都是war包部署,需要修改设置pom.xml
<packaging>war</packaging> -
删除内嵌tomcat依赖
<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><!--设置仅当前idea环境可以,不参与打包--><scope>provided</scope> </dependency> <!--tomcat 不参与打包--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency> -
配置入口类,不再使用内嵌服务器
<configuration><fork>true</fork><!--增加jvm参数--><jvmArguments>-Dfile.encoding=UTF-8</jvmArguments><!--指定入口类--><mainClass>com.baizhi.Springboot06Application</mainClass><skip>true</skip> </configuration>// SpringBootServletInitializer:不在使用内嵌容器启动,使用外部tomact启动 @SpringBootApplication public class Springboot06Application extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {return builder.sources(Springboot06Application.class);} -
在maven里进行打包操作

-
打包后以后

-
在tomcat运行war包项目
-
将WAR文件复制到webapps目录
-
启动Tomcat服务器
# 进入Tomcat的bin目录 cd $CATALINA_HOME/bin # 启动Tomcat服务器 ./startup.sh -
访问应用程序:http://localhost:8080/springboot06
-
jar包部署【推荐】
-
执行在maven执行
**package**进行打包 -
通过控制台打开jar包目录

-
启动jar包
**java -jar jar文件名 nohub &**解释:nohub:后台启动 &:不要日志 -
成功启动

- 注意:打包jsp模板时,pom.xml里面必须使用1.4.2插件(plugin)
相关文章:
Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署
学习视频:【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…...
Pipelined-ADC设计二——结构指标及非理想因素(Part2)
接上文,本章将两个比较重要的非理想因素,因此各项指标制定。后续会对常见的非理想因素给出常见的解决方法,以及设计所采用的方法。 2.2.7. 比较器失调 在流水线 ADC 中,比较器的主要误差来源就是比较器失调,称为失调误…...
Ubuntu 常用命令之 clear 命令用法介绍
📑Linux/Ubuntu 常用命令归类整理 clear命令在Ubuntu系统下用于清除终端屏幕的内容。这个命令没有任何参数,它的主要作用就是清理终端屏幕上的所有信息,使得屏幕看起来像是新打开的一样。 使用clear命令非常简单,只需要在终端中…...
【JAVA面试题】什么是对象锁?什么是类锁?
🍎 个人博客 :个 人 主 页 🏆个人专栏:多线程JAVA ⛳️ 功 不 唐 捐 ,玉 汝 于 成 目录 前言 回答 对象锁(Object Lock): 类锁(Class Lock)࿱…...
飞天使-k8s知识点5-kubernetes基础名词扫盲
文章目录 deploymentspodNodeserviceskubectl 实现应用伸缩kubectl 实现滚动更新kubernetes架构 deployments 中文文档 http://docs.kubernetes.org.cn/251.htmldeployment是用来创建和更新应用的,master 会负责将创建好的应用实例调度到集群中的各个节点 应用实例…...
【视觉实践】使用Mediapipe进行目标检测:杯子检测和椅子检测实践
目录 1 Mediapipe 2 Solutions 3 安装mediapipe 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道</...
C++之深拷贝进阶
目录 拷贝构造函数的深拷贝进阶版本 赋值运算符重载的深拷贝进阶 总结 上期我们学习了C中深拷贝的传统版本,今天我们将学习更为高效的版本。 拷贝构造函数的深拷贝进阶版本 传统版本代码如下: string(string& s):_str(new char[strlen(s._str)…...
导行电磁波从纵向场分量求其他方向分量的矩阵表示
导行电磁波从纵向场分量求解其他方向分量的矩阵表示 导行电磁波传播的特点 电磁波在均匀、线性、各向同性的空间中沿着 z z z轴传播,可用分离变量法将时间轴、 z z z轴与 x , y x,y x,y轴分离,电磁波的形式可表示为: E ⃗ E ⃗ ( x , y )…...
融资项目——swagger2的注解
1. ApiModel与ApiModelProperty(在实体类中使用) 如上图,ApiModel加在实体类上方,用于整体描述实体类。ApiModelProperty(value"xxx",example"xxx")放于每个属性上方,用于对属性进行描述。swagger2网页上的效果如下图&am…...
【性能优化】MySql数据库查询优化方案
阅读本文你的收获 了解系统运行效率提升的整体解决思路和方向学会MySQl中进行数据库查询优化的步骤学会看慢查询、执行计划、进行性能分析、调优 一、问题:如果你的系统运行很慢,你有什么解决方案? 关于这个问题,我们通常首先…...
Chrome浏览器http自动跳https问题
现象: Chrome浏览器访问http页面时有时会自动跳转https,导致一些问题。比如: 开发阶段访问dev环境网址跳https,后端还是http,导致接口跨域。 复现: 先访问http网址,再改成https访问…...
【C++进阶02】多态
一、多态的概念及定义 1.1 多态的概念 多态简单来说就是多种形态 同一个行为,不同对象去完成时 会产生出不同的状态 多态分为静态多态和动态多态 静态多态指的是编译时 在程序编译期间确定了程序的行为 比如:函数重载 动态多态指的是运行时 在程序运行…...
PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)
十多年前开发框架时,为了效率不断试过各种代码写法,今天又遇到了,想想php8时代会不会有所变化,结果其实也还是和当年一样,但当年没写博客,但现在可以把数据记录下来了。 PHP_loop_ireflies_dark_forest 项目…...
【Seata源码学习 】 扫描@GlobalTransaction注解 篇一
1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制,在应用上下文启动时,会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…...
DBA-MySql面试问题及答案-上
文章目录 1.什么是数据库?2.如何查看某个操作的语法?3.MySql的存储引擎有哪些?4.常用的2种存储引擎?6.可以针对表设置引擎吗?如何设置?6.选择合适的存储引擎?7.选择合适的数据类型8.char & varchar9.Mysql字符集10.如何选择…...
网络爬虫之Ajax动态数据采集
动态数据采集 规则 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览器中可以看到正常显示的页面教据,但是使用 requests 得到的结果并没有,这是因为requests 获取的都是原始的 HTML 文档…...
c语言的初始学习(练习)
##初学c语言---MOOC浙江大学翁恺先生学习c语言 那么我们先看看这个题目吧,这是初始语法的应用。 记住,我们的程序是按步骤执行的,并不是在不同的两行同时进行。 程序设计:1.了解题目的需要,几个变量需要用到&#x…...
研究论文 2022-Oncoimmunology:AI+癌RNA-seq数据 识别细胞景观
Wang, Xin, et al. "Deep learning using bulk RNA-seq data expands cell landscape identification in tumor microenvironment." Oncoimmunology 11.1 (2022): 2043662. https://www.tandfonline.com/doi/full/10.1080/2162402X.2022.2043662 被引次数࿱…...
ChatGPT4与ArcGIS Pro3助力AI 地理空间分析和可视化及助力科研论文写作
在地学领域,ArcGIS几乎成为了每位科研工作者作图、数据分析的必备工具,而ArcGIS Pro3除了良好地继承了ArcMap强大的数据管理、制图、空间分析等能力,还具有二三维融合、大数据、矢量切片制作及发布、任务工作流、时空立方体等特色功能&#x…...
okhttp系列-一些上限值
1.正在执行的任务数量最大值是64 异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现runningAsyncCalls的数量大于等于64,就不从readyAsyncCalls取出任务执行。 public final class Dispatcher {private int …...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
构建Docker镜像的Dockerfile文件详解
文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...
