【JavaEE spring】SpringBoot 统一功能处理

news2024/12/26 11:49:18

SpringBoot 统一功能处理

  • 1. 拦截器
    • 1.1 拦截器快速⼊⻔
    • 1.2 拦截器详解
      • 1.2.1 拦截路径
      • 1.2.2 拦截器执⾏流程
    • 1.3 登录校验
      • 1.3.1 定义拦截器
      • 1.3.2 注册配置拦截器
  • 2. 统⼀数据返回格式
    • 2.1 快速⼊⻔
    • 2.2 存在问题
    • 2.3 案例代码修改
    • 2.4 优点
  • 3. 统⼀异常处理

1. 拦截器

后端程序根据Session来判断⽤⼾是否登录, 但是实现⽅法是⽐较⿇烦的

  • 需要修改每个接⼝的处理逻辑
  • 需要修改每个接⼝的返回结果
  • 接⼝定义修改, 前端代码也需要跟着修改

1.1 拦截器快速⼊⻔

什么是拦截器?

拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执⾏预先设定的代码.

在这里插入图片描述
下⾯我们先来学习下拦截器的基本使⽤.

拦截器的使⽤步骤分为两步:

  1. 定义拦截器器
  2. 注册配置拦截器

⾃定义拦截器:实现HandlerInterceptor接⼝,并重写其所有⽅法

@Slf4j
@Component
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, @Nullable ModelAndView modelAndView) throws Exception {
        log.info("目标方法执行后, 反馈执行");
    }

}
  • preHandle()⽅法:⽬标⽅法执⾏前执⾏. 返回true: 继续执⾏后续操作; 返回false: 中断后续操作.
  • postHandle()⽅法:⽬标⽅法执⾏后执⾏

注册配置拦截器:实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 自定义拦截器对象
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor) // 注册自定义拦截器对象
                .addPathPatterns("/**"); // 设置拦截器请求的路径
    }
}

启动服务, 试试访问任意请求, 观察后端⽇志

在这里插入图片描述
我们把拦截器中preHandle⽅法的返回值改为false, 再观察运⾏结果在这里插入图片描述
可以看到, 拦截器拦截了请求, 没有进⾏响应

1.2 拦截器详解

拦截器的⼊⻔程序完成之后,接下来我们来介绍拦截器的使⽤细节。拦截器的使⽤细节我们主要介绍两个部分:

  1. 拦截器的拦截路径配置
  2. 拦截器实现原理

1.2.1 拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求⽣效.

我们在注册配置拦截器的时候, 通过 addPathPatterns() ⽅法指定要拦截哪些请求. 也可以通过excludePathPatterns()指定不拦截哪些请求.

上述代码中, 我们配置的是 /** , 表⽰拦截所有的请求.

⽐如⽤⼾登录校验, 我们希望可以对除了登录之外所有的路径⽣效.
在这里插入图片描述

在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常⻅拦截路径设置:
在这里插入图片描述

以上拦截规则可以拦截此项⽬中的使⽤ URL,包括静态⽂件(图⽚⽂件, JS 和 CSS 等⽂件).

1.2.2 拦截器执⾏流程

在这里插入图片描述

  1. 添加拦截器后, 执⾏Controller的⽅法之前, 请求会先被拦截器拦截住. 执⾏ preHandle() ⽅法,这个⽅法需要返回⼀个布尔类型的值. 如果返回true, 就表⽰放⾏本次操作, 继续访问controller中的⽅法. 如果返回false,则不会放⾏(controller中的⽅法也不会执⾏).
  2. controller当中的⽅法执⾏完毕后,再回过来执⾏ postHandle() 这个⽅法以及afterCompletion() ⽅法,执⾏完毕之后,最终给浏览器响应数据.

1.3 登录校验

通过拦截器来完成图书管理系统中的登录校验功能

1.3.1 定义拦截器

在这里插入图片描述
在这里插入图片描述

1.3.2 注册配置拦截器

在这里插入图片描述

2. 统⼀数据返回格式

2.1 快速⼊⻔

统⼀的数据返回格式使⽤ @ControllerAdvice 和 ResponseBodyAdvice 的⽅式实现

  • @ControllerAdvice 表⽰控制器通知类
  • 添加类 ResponseAdvice , 实现 ResponseBodyAdvice 接⼝, 并在类上添加@ControllerAdvice 注解
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return ResponseData.success(body);
    }
}
  • supports⽅法: 判断是否要执⾏beforeBodyWrite⽅法. true为执⾏, false不执⾏. 通过该⽅法可以选择哪些类或哪些⽅法的response要进⾏处理, 其他的不进⾏处理.

    从returnType获取类名和⽅法名
    在这里插入图片描述

  • beforeBodyWrite⽅法: 对response⽅法进⾏具体操作处理

2.2 存在问题

  • 返回 String 结果会报错

在这里插入图片描述

  • 解决方法: 判断 返回的结果是否为String, 如果是, 则使用 json 序列化
    在这里插入图片描述

2.3 案例代码修改

  • 如果⼀些⽅法返回的结果已经是Result类型了, 那就直接返回Result类型的结果即可

2.4 优点

  1. ⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据
  2. 降低前端程序员和后端程序员的沟通成本, 按照某个格式实现就可以了, 因为所有接⼝都是这样返回的.
  3. 有利于项⽬统⼀数据的维护和修改.
  4. 有利于后端技术部⻔的统⼀规范的标准制定, 不会出现稀奇古怪的返回内容.

3. 统⼀异常处理

统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表⽰控制器通知类, @ExceptionHandler 是异常处理器,两个结合表⽰当出现异常的时候执⾏某个通知,也就是执⾏某个⽅法事件

在这里插入图片描述

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

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

相关文章

浅谈——开源软件的影响力

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

立式台灯什么牌子好?立式护眼台灯品牌推荐

经常关灯看小说、凌晨加班的朋友都知道,眼睛很容易出现红血丝酸痛的症状,也有一些学生朋友夜间学习导致眼睛视力模糊。 这一系列的情况归根到底都来源于光线,不良的光线会不断给眼睛造成压力,久而久之出现用眼疲劳引起近视的风险…

C#入门详解_01_课程简介、C#语言简介、开发环境和学习资料的准备

文章目录 1. 课程简介2. C#语言简介3.开发环境与学习资料 1. 课程简介 开设本课程的目的 传播C#开发的知识,让更多的人有机会接触到软件开发行业引导有兴趣或者想转行的朋友进入软件开发行业 课程内容 完整讲述C#语言在实际软件开发中的应用采用知识讲述加实例程序…

Easy Excel导出一个表格多个Sheet

步骤: 1.查找官方API文档理解实现 2.实现融入到代码里面 一:Easy Excel重复多次写入(写到单个或者多个Sheet) 重复多次写入(写到单个或者多个Sheet) 理解重点: // 每次都要创建writeSheet 这里注意必须指定sheetNo 第几个sheetNo 而且sh…

WPF图表库LiveChart异常问题处理-System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围

问题: 在使用liveChart处理一个以时间为X轴的曲线时,遇到一个报错:指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:“Specified argument was out of the range of valid values. Arg_ParamName_Name” 指定的参数超出了有…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

Empowering Multimodal LLMs with Foresight Minds(Merlin)论文精读

paper:https://arxiv.org/pdf/2312.00589.pdfcode:https://ahnsun.github.io/merlin/ 0 Abstract 根据观测预测未知是人类的一个能力,对MLLM进行“future modeling”可以更好地激发其潜能;物体轨迹是一种连续帧间高度结构化的表…

计算机毕业设计 | vue+springboot 教务管理系统(附源码)

1,项目背景 随着我国高等教育的发展,数字化校园将成为一种必然的趋势,国内高校迫切需要提高教育工作的质量与效率,学生成绩管理工作是高校信息管理工作的重要组成部分,与国外高校不同,他们一般具有较大规模…

c#矩阵行列式计算//线程同步

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 实现矩阵行列式计算 {internal class Program{static void Main(string[] args){//定义矩阵Console.WriteLine("矩阵是:&quo…

ICV报告:最新排名!北京下降至第三位

2日,面向前沿科技领域的全球咨询机构ICV发布了《GFII-2023 报告》,其中在“2023年全球产业未来评估:未来20个城市”排名中显示,北京排名居世界第三。进入前十名的其他未来产业城市分别是旧金山-圣何塞、伦敦、慕尼黑、波士顿、纽约、东京横滨…

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人

如今,大模型层出不穷,这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是,普通人使用大模型还是有一定…

前端工程化之:webpack2-2(内置插件)

目录 一、内置插件 1.DefinePlugin 2.BannerPlugin 3.ProvidePlugin 一、内置插件 所有的 webpack 内置插件都作为 webpack 的静态属性存在的,使用下面的方式即可创建一个插件对象: const webpack require("webpack")new webpack.插件…

【JVM调优及常见的JVM调优参数以及作用】

JVM调优及常见的JVM调优参数以及作用 JVM调优通常涉及以下几个方面:1. 堆内存调优:2. 垃圾回收调优:3. 线程调优:4. 类加载调优:JVM的优化配置可以通过设置JVM的启动参数来实现。以下是一些常用的JVM优化配置参数及其示…

steam搬砖项目赚钱吗?操作流程看这一篇就够了

很多人应该听说过steam,它是国外一款知名的游戏社交平台,也是目前世界上最大的游戏平台之一。而steam搬砖项目,关键就是靠信息差。我们要做的就是在steam以低价买入道具装备,然后上架到网易buff卖出,赚取差价。 什么人…

新年心愿清单怎么写 用这个软件列心愿清单更方便

新年的钟声在耳畔回荡,我站在窗前,看着外面熙熙攘攘的人群,心中充满了期待。新的一年,新的开始,我有很多心愿想要实现。于是,我决定写下一份心愿清单,给来年定下奋斗的方向。 但是,…

React实例之完善布局菜单(一)

今天我们来用所学的知识来做一个布局菜单的组件, 针对这个组件我之前写过一个教程 React之布局菜单-CSDN博客,那个呢比较基础,这节课算是对那个教程的一个扩展和补充。这个实例讲完,这个系列就算告一段落了。先看效果 这个教程要求对React知识…

uniapp使用u-popup组件弹窗出现页面还可滑动

*1、问题所在: 弹窗遮罩层出现了页面依旧可以上下滑动 2、要求: 为了用户更好交互体验,弹窗出现后应禁止页面往下滑动 3、实现思路: 在弹窗盒子外层添加个阻止触摸冒泡事件,使用touchmove.stop.prevent 4、代码如下&#xff…

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要,需要文本编辑时,支持项目符号(无序列表)尝试了BulletSpan,但不是很理想,并且考虑到影响老版本回显等因素,最终决定自定义一个BulletEditText。 先看效果&…

【深度学习】讲透深度学习第3篇:TensorFlow张量操作(代码文档已分享)

本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实…

vue + 动态加载图片

首先尝试我们经常用的require动态引入&#xff0c; 发现报错&#xff1a;require is not defind&#xff0c;这是因为 require 属于 Webpack 的方法&#xff0c;我现在的环境是 vue3.0 vite 1、 适用于处理少量链接的资源文件 import img from ./img.png; <img :src"…