Spring统一功能

news2024/10/7 4:31:31

文章目录

  • 一、什么是统一功能
  • 二、拦截器
    • 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. 添加图书
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重大进展!微信支付收款码全场景接入银联网络

据中国银联6月19日消息,近日,银联网络迎来微信支付收款码场景的全面接入,推动条码支付互联互通取得新进展,为境内外广大消费者提供更多支付选择、更好支付体验。 2024年6月,伴随微信支付经营收款码的开放,微…

【low-ui-vue】实现原生可扩展动态表格组件

本文字数:3520字 预计阅读时间:20分钟 所谓动态列的表格,就是列数不固定。像广为使用的elementUI的table组件就是表头写死的,这种也叫列数固定的表格。 01 效果 当然,动态性增加了,当然要做出一定“牺牲”。…

sys.stdin对象——实现标准输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后&am…

Epic商店登录时一直转圈圈怎么回事?Epic登录转圈圈解决办法

很多游戏玩家都喜欢在Epic商店上面免费领取游戏,但是经常在登陆领取的过程中,遇到Epic账号登陆不上的问题,登陆界面一直转圈圈,下面分享一下具体解决办法,帮助大家顺利流畅登陆,轻松喜加一。 如果遇到Epic商…

常用组件详解(一):nn.Conv2d、nn.functional.conv2d()

文章目录 一、torch.nn.Conv2d基本介绍1.1构造方法1.2参数、偏置、属性1.2.1参数与偏置1.2.2可查看属性 1.3torch.nn.functional.conv2d1.4dilation 二、卷积操作2.1in_channels1, out_channels1, kernel_size3, stride1, padding02.2in_channels1, out_channels1, kernel_size…

Nuxt3 实战 (十二):SEO 搜索引擎优化指南

添加 favicon 图标和 TDK(标题、描述、关键词) nuxt.config.ts 添加配置: export default defineNuxtConfig({app: {title:Dream Site,meta: [{ name: keywords, content: Nuxt.js,导航,网站 },{ name: description, content: 致力于打造程…

详细解析MATLAB和Simulink中的文件格式:mat, mdl, mexw32, 和 m 文件

matlab 探索MATLAB和Simulink中的文件格式:MAT, MDL, MEXW32, 和 M 文件**MAT 文件 (.mat)****MDL 文件 (.mdl)****MEX 文件 (.mexw32/.mexw64)****M 文件 (.m)****总结** 探索MATLAB和Simulink中的文件格式:MAT, MDL, MEXW32, 和 M 文件 当你开始使用M…

JS(JavaScript)入门指南(DOM、事件处理、BOM、数据校验)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 玉阶生白露,夜久侵罗袜。 却下水晶帘,玲珑望秋月。 ——《玉阶怨》 文章目录 一、DOM操作1. D…

MySQL:内置函数、复合查询

文章目录 1.日期函数2.字符串函数3.数学函数4.其他函数5.复合查询5.1基本复合查询5.2 多表查询5.3 自连接5.4 子查询5.4.1 子查询与where5.4.2 子查询与from5.4.3 合并查询 1.日期函数 日期:年月日 时间:时分秒 日期函数的使用: 案例&…

print()函数——打印输出

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 print()函数是Python编程最常见的函数,常用于输出程序结果,默认输出到屏幕,也可以输出到指定文件。 语法参考 pr…

VNode是什么?

什么是VNode VNode的全称是Virtual Node,也就是虚拟节点.它是指一个抽象的节点对象,用于描述真实DOM中的元素。在前端框架中,通过操作VNode来实现虚拟DOM,从而提高性能。 VNode的本质 本质上是JavaScript对象,这个对象就是更加轻量级的对DOM…

【Windows 常用工具系列 17 -- windows bat 脚本多参数处理】

请阅读【嵌入式开发学习必备专栏】 文章目录 bat 脚本命令行参数使用示例多参数处理使用示例遍历所有参数 bat 脚本命令行参数 在Windows批处理(.bat)脚本中接收命令行参数是一个常见的需求,这样的脚本能够根据提供的参数执行不同的操作。命…

VS 在多线程中仅调试某个线程

调试多线程程序时,只想观察某个线程的运行情况; 但是,由于线程切换执行,会导致调试时焦点在几个代码块之间跳来跳去,故需要解决这个问题。 参考文章: C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

Unity开发中遇到的问题以及解决思路 Ver1.0

文章目录 Git1.明明连接成功了,为什么显示仓库不存在? UI1.从Resources加载图片:路径没错却加载为空?2.滚动页面想让他只在纵向或者横向滚动怎么办?3.滚动页面的元素是从中间向两边生成怎么办?4.如何让ui物…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式,通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

高三学生的倒计时 给高考一个倒计时 让学习更有计划的进行

高三学生的压力是很大的,时间也是很紧迫,仅仅一年的时间,许多人都觉得不够用,为了让学子们更有时间紧迫感,更清晰的掌握时间,我们需要一个准确提醒的倒计时效果。 把这个倒计时放到班级电脑上,是…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

LLMs 驱动的数据合成、整理和评估

1. AI 速读 总体概要 本文综述了大型语言模型(LLMs)在合成数据生成、筛选和评估方面的最新进展,旨在为学术和工业界提供深入、系统化的研究方向。文章强调了合成数据在解决真实世界数据局限性中的重要性,特别是在数据量和质量方…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星,拼多多以其独特的商业模式迅速崛起,吸引了众多商家和消费者的目光。对于新手来说,如何在拼多多平台上开展运营活动,成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

类与对象(1)

1.c升级了类 C 语言结构体中只能定义变量,在 C 中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用 C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C 方式实现&…