Spring统一功能

文章目录

  • 一、什么是统一功能
  • 二、拦截器
    • 2.1 什么是拦截器
    • 2.2 拦截器的使用
    • 2.3 案例:不拦截前端的请求
    • 2.4 拦截器是如何实现的 ---- >分析DispatcherServlet源码分析
  • 三、适配器模式
  • 四、统一数据返回格式
  • 五、统一异常
  • 六、案例:在图书管理系统使用统一功能

一、什么是统一功能

  1. 什么是统一功能:大家都要做的事情,每一个接口都要执行这个操作
  2. 统一功能包含两个部分
    • (1)Spring本身提供的统一功能
    • (2)Spring本身并没有提供某个统一功能,但我们又需要,如何去自定义

二、拦截器

2.1 什么是拦截器

  1. 什么是拦截器:主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码。
    • 统一功能之一:是Spring提供的统一功能的其中之一,可以公共地对一个信息进行处理
    • 作用维度:拦截器的作用维度是URL,像Service代码没有配置我们是拦截不了的
  2. 使用拦截器后的执行流程
    • 请求:之前请求过来,先进入Controller,如果有拦截器,是先进入拦截器看有没有需要预先执行的方法,如果有且拦截器放行了,才会去执行Controller里的代码
    • 响应:返回时,当Controller里的方法全部执行完,会被拦截器拦截,执行拦截器中设置的【响应后的代码】
      在这里插入图片描述

2.2 拦截器的使用

在这里插入图片描述

@Configuration
public class webConfig implements WebMvcConfigurer { //WebMvcConfigurer是一个Mvc的配置器
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)  //添加拦截器
                .addPathPatterns("/**")	   //要拦截哪些方法
                .excludePathPatterns("");  //哪些不进行拦截
    }
}
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("目标方法执行前");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("目标方法执行后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
  1. 关于路径的定义:addPathPatterns 和 excludePathPatterns里放的是网络路径,而非文件路径
    • /*:一级路径
      • 能匹配/user、/book
      • 不能匹配/user/login
    • /**:任意级路径
      • 能匹配/user、/user/login、/book/addBook,所有路径都能匹配
    • /book/*:/book下的一级路径
      • 能匹配/book/addBook
      • 不能匹配/book/addBook/1,/book
    • /book/**:/book下的任意级路径
      • 能匹配/book、/book/addBook
      • 不能匹配/user/login

2.3 案例:不拦截前端的请求

  1. 问题描述
    • 因为此时除了【/user/login】这个后端请求,所有的请求都被拦截了,这包括了前端的所有请求(甚至图片的访问都被拦截了)
    • 比如我们无法通过在浏览器输入【http://127.0.0.1:8080/login.html】来访问这个网页并进行后续的登录操作
@Configuration
public class webConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login");
    }
}
  1. 解决方法:把前端的访问路径通过【excludePathPatterns()】排除掉
    在这里插入图片描述
    在这里插入图片描述
  2. 关于excludePathPatterns()的其他写法
    在这里插入图片描述

2.4 拦截器是如何实现的 ---- >分析DispatcherServlet源码分析

  1. 源码如何阅读:找核心代码,不要钻牛角尖。一行一行地细细研究,很快就会忘记当前在哪了。
    • 阅读方法:切忌从头到尾一行一行地去读代码,一点一点去研究,一定要找到关键代码后,在宏观上对整个流程或整个原理有一个认识后,有时间再去看里面的细节
    • 快捷键:如果我们看调用代码时,忘记了前后调用的顺序,可以通过下面两个快捷键来操作
      • ctrl + [:回到上一步操作
      • ctrl + ]:来到下一步操作
  2. 步骤
    • 程序启动后,拦截器会初始化DispatcherServlet
      在这里插入图片描述
      在这里插入图片描述

    • DispatcherServlet的 init 阶段
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • DispatcherServlet的 service 阶段
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    • DispatcherServlet的 destory 阶段

三、适配器模式

  1. 什么是适配器模式
    在这里插入图片描述
    在这里插入图片描述

  2. 适配器模式的实现

    • 此处我们模拟Slf4j:@Slif4j既是一个典型的模型模式,也是一个适配器模式
      • 一个框架用到的模式是非常多的,可能源码的短短几行代码就能体现出2,3种设计模式
    • 代码
      • 为什么用户不能直接调log4j和slf4j:不能保证所有的人都用所有的日志框架,项目之间可能会有冲突,需要有一个门面
        在这里插入图片描述
  3. 应用场景:版本升级

    • 适配器模式是一种补偿模式,不是一开始就有的,是后期设计上的缺陷没办法修改了的打补丁式的无奈之举
    • 所以适配器的应用场景主要是对正在运行的代码进行改造,并且希望复用原有代码实现新的功能,比如版本升级等

四、统一数据返回格式

  1. 效果:使每一个接口返回的数据都是同种格式的

  2. 实现方法:使用@ControllerAdvice注解 + ResponseBodyAdvice接口 + 重写两个方法
    在这里插入图片描述

  3. 当前代码存在的问题
    在这里插入图片描述
    在这里插入图片描述

  4. 为什么返回结果为String时,后端无法正确执行
    在这里插入图片描述
    在这里插入图片描述

  5. 上述问题的解决方法
    在这里插入图片描述

  6. 为什么用了ObjectMapper后,可以解决String的问题
    在这里插入图片描述

  7. 统一数据返回格式的优点

    • 由于返回的数据都变成了Result,方便前后端沟通,前端人员知道返回的数据是什么样的
    • 后端代码不需要太多的改动,就可以统一返回格式

五、统一异常

  1. 为什么要有统一异常:自己的错误自己知道即可,不给外界知道

    • 对于后端而言:我们不希望把一些诸如空指针的错误放给前端看
    • 对于前端而言:也希望不给用户看太细致的错误,而是统一跳转到一个页面,比如内部出错了,找不到页面之类的
  2. 什么时候统一异常不会生效:如果代码已经手动用try-catch捕获了,就不会被我们写的【统一异常处理】捕获到了,如果没有手动捕获,才会被统一处理

  3. 针对的对象:主要针对的是运行时异常

  4. 代码

    • 固定的三个注解:@ResponseBody、@ControllerAdvice、@ExceptionHandler
    • @Slf4j:建议加上日志,方便后续找错
      在这里插入图片描述
  5. @ControllerAdvice注解分析
    在这里插入图片描述

  6. 为什么统一异常代码能生效
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  7. 如何阅读源码:注意源码的版本匹配

    • 方式一:IDEA上点击Download Source
    • 方式二: 去Spring的github上查看

六、案例:在图书管理系统使用统一功能

  1. 登录:登录没有进行拦截,所以没有连接失败的情况(不需要写error),只需要更改前端代码即可
    在这里插入图片描述
  2. 返回图书列表
    在这里插入图片描述
  3. 添加图书
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746841.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统启动流程

init程序类型: ①、SysV:init,centos 5之前,配置文件/etc/init.d/ ②、Upstart: init,centos 6,配置文件/etc/init.d/ /etc/init/ ③、Systemd:Systemd,centos 7,配置文件/usr/li…

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】

设置系统时间 本模块用来设置、获取当前系统时间,设置、获取当前系统日期和设置、获取当前系统时区。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import systemTime …

第三十三篇——互联网广告:为什么Google搜索的广告效果好?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 对于信息的利用,再广告这个维度中去洞察,你又能发…

在低版本Excel中创建次级下拉列表

在低版本中indirect函数不支持选区,创建次级下拉列表得依靠“名称管理”给选区命名。 (笔记模板由python脚本于2024年06月26日 06:24:22创建,本篇笔记适合常用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www…

3.任务的创建与删除

1.什么是任务? 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 任务通常都含有while(1)死循环 2.任务创建与删除相关的函数 3.CUBEMAX相关配置 编辑一个led1闪烁的任务

JAVA开发的一套医院绩效考核系统源码:KPI关键绩效指标的清晰归纳

KPI是关键绩效指标(Key Performance Indicators)的缩写,它是一种用于衡量员工或组织绩效的量化指标。这些指标通常与组织的目标和战略相关,并帮助管理层评估员工和组织的实际表现。KPI还可以为员工提供清晰的方向,使他…

怎么把不同的文件做成二维码?多种文件类型在线生码的制作方法

扫码来展示文件是现在很多场景下会使用的一种内容展示方法,这种方式能够简化其他人获取文件的流程,从而提升文件传播的效率,用户可以存储二维码,随时扫码查看文件内容。文件生成二维码支持多种类型的文件使用,比如ppt、…

PS教程29

图层蒙版 以案例来解释蒙版的作用 将这两张图片原框背景切换将图二的背景选中使用套索工具选中区域切换图一CtrlA全选CtrlC复制编辑-选择性粘贴-贴入即可贴入如果位置不对用移动工具进行调整 这就是图层蒙版 图层蒙版本质作用:是临时通道,支持黑白灰三种…

什么是凸/非凸数据?

简单来说,数据集D中任意两点的连线上的点,也会在数据集D内,那么数据集D就是一个凸集。 如下图,左边非凸,右边为凸

【华为OD机试|01】最远足迹(Java/C/Py/JS)

目录 一、题目介绍 1.1 题目描述 1.2 备注: 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解: 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …

Linux开发讲课16--- 【内存管理】页表映射基础知识2

ARM32页表和Linux页表那些奇葩的地方 ARM32硬件页表中PGD页目录项PGD是从20位开始的,但是为何头文件定义是从21位开始? 历史原因:Linux最初是基于x86的体系结构设计的,因此Linux内核很多的头文件的定义都是基于x86的&#xff0c…

离线安装docker-v26.1.4,compose-v2.27.0

目录 ​编辑 1.我给大家准备好了提取即可 2.安装docker和compose 3.解压 4.切换目录 5.执行脚本 6.卸载docker和compose 7.执行命令 “如果您在解决类似问题时也遇到了困难,希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历,…

Java 8 新特性:Lambda表达式让你的代码焕然一新——掌握它,让编程变得轻松又高效!

前言 Java 8 是 Java 发展史上的一次重要里程碑。作为企业级开发语言,它在性能和功能上做了巨大的提升。这其中,Lambda表达式是一个关键的新特性,它为 Java 语言带来了函数式编程的概念。本篇文章将深入探讨Lambda表达式,并结合热…

[油猴脚本] Image To Ascii 快速转换审计网站图片中敏感信息插件

项目地址:https://github.com/MartinxMax/ImageToAscii 导入 将ImagetoAscii.user.js导入油猴 进行按照 访问网站分析图片 当鼠标靠近图片时会出现分析按钮 通过审查图片信息,我们可以快速发现这张图片存在PHP代码。 当然在渗透测试中,你可以快速查看上传的图片木马中PHP代码…

vuejs3用gsap实现动画

效果 gsap官网地址&#xff1a; https://gsap.com/ 安装gsap npm i gsap 创建Gsap.vue文件 <script setup> import {reactive, watch} from "vue"; import gsap from "gsap"; const props defineProps({value:{type:Number,default:0} }) cons…

多线程思维导图

多线程 线程是一个程序内部的一条执行流程 多线程的好处————消息通信&#xff0c;网页浏览等等 多线程是指从软硬件上实现多条执行流程的技术 并发和并行同时执行 多线程的创建 Java.Long包下的Thread类 定义一个子类…

RT-Thread使用HAL库实现双线程控制LED交替闪烁

如何创建工程我的其他文中你面有可以进去查看 1创建线程&#xff08;以动态方式实现&#xff09; 1-2创建函数入口 1-2启动函数 main.c文件源码 /** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date …

自动驾驶技术综述:附自动驾驶公司一览表

前言 自动驾驶技术是一项复杂的系统工程&#xff0c;涵盖了众多技术领域。本文将从硬件和软件两个方面&#xff0c;详细介绍自动驾驶汽车涉及的关键技术&#xff0c;希望能为您提供有益的参考。 一、硬件 自动驾驶汽车的实现离不开各种硬件的支持。以下是一张自动驾驶研究所…

【LeetCode 274】H指数

1. 题目 2. 分析 这题没啥难度&#xff0c;需要熟练运用Python API。 sort(reverseTrue)可以用于排序List&#xff0c;并且倒序排序。 3. 代码 class Solution:def hIndex(self, citations: List[int]) -> int:citations.sort(reverseTrue)res 0for idx,cite in enume…

CentOS7环境脚本一键安装MySQL8

安装包准备 获取下载地址 选择对应的下载版本&#xff0c;如下图&#xff0c;右键RPM Bundle的Download&#xff0c;复制下载链接地址 下载安装包 [hadoopnode3 installfile]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.31-1.el7.x86_64.rpm-bund…