SpringBoot统一功能处理实现的全过程
作者:如风暖阳 发布时间:2021-06-12 11:14:49
前言
这篇文章主要介绍Spring Boot的统一功能处理模块,也是AOP的实战环节。
1.用户登录权限效验
在学习Spring AOP之前,用户登录权限的验证是由每个方法中自己验证。
1.1 Spring AOP 实现用户统一登录验证
而学习了Spring AOP之后,可以通过Spring AOP的前置通知或环绕通知来实现,具体实现代码如下:
但如果在以上Spring AOP的切面中实现用户权限效验的功能,有以下两个问题:
1.没办法获取到HttpSession对象。
2.我们要对一部分方法进行拦截,而另一部分方法不拦截,如注册方法和登录方法是不拦截的,这样的话排除方法的规则很难定义,甚至没办法定义。
要解决上述问题,就需要使用下边的Spring * :
1.2 Spring *
对于以上问题Spring中提供了具体的实现 * :HandlerInterceptor, * 的实现分为以下两个步骤:
1、创建自定义 * ,实现 HandlerInterceptor
接口的perHandle
(执行具体方法之前的预处理)方法。
2、将自定义 * 加入 WebMvcConfiger
的 addInterceptors
方法中。
具体实现如下:
1.2.1 自定义 *
自定义 * 是一个普通类,具体实现代码如下:
1.2.2 将自定义 * 加入到系统配置
将上一步中的自定义 * 加入到系统配置信息中,具体实现代码如下:
其中:
addPathPatterns:表示需要拦截的URL,
**
表示拦截任意方法(也就是所有方法)excludePathPatterns:表示需要排除的URL。
说明:以上拦截规则可以拦截此项目中使用的URL,包括静态文件(图片文件、JS和CSS等文件)。
1.3 * 实现原理
在用户调用Controller
的方法之前, * 进行预处理,符合条件才会进一步调用Controller
层的方法。
2.统一异常处理
在我们的程序出错时,前端可能根本不知道是由于什么原因,而导致程序不能正常运行,所以我们就需要通过统一异常的处理方式,使得前端获取到程序异常的具体原因,进而使得程序员更好的解决问题。
统一异常处理使用的是@ControllerAdvice
+@ExceptionHandler
来实现的,@ControllerAdvice
表示控制器通知类,@ExceptionHandler
是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件,具体实现代码如下:
方法名和返回值可以自定义,其中最重要的是@ExceptionHandler(Exception.class)注解。
以上方法表示,如果出现了异常,就可以返回给前端一个HashMap对象,我们也可以针对不同的异常返回不同的结果,具体执行的异常通知符合当前异常向上依次匹配的规则。
在浏览器中输入127.0.0.1:8080/user/reg
,查看统一异常处理后的执行效果,可以发现,之前返回的是执行了 reg 方法
,但现在如果程序再因为异常原因不能正常运行,前端就会获取到异常的原因了。
3.统一数据返回格式
3.1 统一数据返回格式的优点
方便前端程序员更好的接受和解析后端数据接口返回的数据。
降低前端程序员和后端程序员的沟通成本,按照某个格式实现就可以了,因为所有接口都是这样返回的。
有利于项目统一数据的维护和修改。
有利于后端技术部门的统一规范的标准制定,不会出现稀奇古怪的返回内容。
3.2 统一数据返回格式的实现
统一的数据返回格式可以使用@ControllerAdvice
+ResponseBodyAdvice
的方式实现,具体实现代码如下:
在浏览器输入127.0.0.1:8080/user/login
,在统一数据格式之前,前端页面接收到的参数为布尔类型true/false
,而现在返回的就是统一格式的数据了。
4.总结
统一用户登录权限的效验使用WebMvcConfigurer+HandlerInterceptor来实现
统一异常处理使用@ControllerAdvice+@ExceptionHandler来实现
统一返回值处理使用@ControllerAdvice+ResponseBodyAdvice来处理
来源:https://blog.csdn.net/qq_60856948/article/details/128559397


猜你喜欢
- HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决
- 一. 概述参考开源项目https://github.com/xkcoding/spring-boot-demo在系统运维中, 有时候为了避免
- 本文实例讲述了Android使用ViewFlipper和GestrueDetector共同实现滑屏效果。分享给大家供大家参考,具体如下:关于
- 1、概述传统的Android开发架构一般是MVC模式,Model:业务逻辑和实体模型View:对应于布局文件Controllor:对应于Ac
- 翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And
- 引言在之前的文章里,我们聊到了 Java 标准库中 HashMap 与 LinkedHashMap 的实现原理。HashMap 是一个标准的
- 前言SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对J
- 这篇文章主要介绍了Java利用读写的方式实现音频播放代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 一、前期准备1、申请好微信商户号appid,拿到商户id和商户秘钥,退款的话需要商户证书2、申请好支付宝商户号appid,商户公钥和秘钥(需
- 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消
- 本文实例讲述了Android自动朗读TTS用法。分享给大家供大家参考,具体如下:TextToSpeech简称 TTS,是自Android 1
- using System;using System.Collections.Generic;using System.Text;namesp
- 概要本节要实现的是多表关联查询的简单demo。场景是根据id查询某商品分类信息,并展示该分类下的商品列表。一、Mysql测试数据新建表Cat
- 什么是Junit5 ?先看来个公式:JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vin
- 1. 前言ResultSetMetaData 叫元数据,是数据库 列对象,以列为单位封装为对象。元数据,指的是其包含列名,列值,列类型,列长
- 先看看下面的代码能不能编译通过:public static void main(String[] args) {List l1 = new
- 本文实现android系统照相机的调用来拍照项目的布局相当简单,只有一个Button:<RelativeLayout xmlns:an
- 本文介绍为了实现高效并发,虚拟机对 synchronized 做的一系列的锁优化措施高效并发是从 JDK5 升级到 JDK6 后一项重要的改
- 1安装eclipse插件步骤,点击help,选择Eclipse Marketplace2.输入Scala,点击go3.选择搜索到的Scala
- 系统需要用到一个导入excel文件的功能,使用poi组件常规方式读取excel时,内存耗尽,OutOfMemoryError,或者读取非常慢