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
猜你喜欢
- 我们在代码中经常使用using保障非托管资源的释放 static void Main(string[] args){
- 线程的两种创建方式及优劣比较1、通过实现Runnable接口线程创建(1).定义一个类实现Runnable接口,重写接口中的run()方法。
- 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。下面介绍一下如何解决。
- 前言在我们平时使用图形化界面的时候,会发现来建立一个文件夹或者一个文档的时候很简单,只需要在桌面单击鼠标右键就可以了。但是,在我们写项目的时
- 本文实例讲述了C#写入对象或集合类型数据到xml文件的方法。分享给大家供大家参考。具体实现方法如下:public static string
- OutputDebugString属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了。可以把调
- 本文实例讲述了C#实现对数组进行随机排序类。分享给大家供大家参考。具体如下:这个一个扩充C#随机数发生器的类,可以随机生成指定范围的数字,可
- 最近由于工作要求:前端采用vue开发,后端采用springboot开发,前后端分离开发,最后前端页面又整合到后端来。经历多次采坑,总结以下方
- ListJava 的list又分为 ArrayList 和 LinkedListArrayListprivate class Itr imp
- 本文实例讲述了Java基于栈方式解决汉诺塔问题。分享给大家供大家参考,具体如下:/** * 栈方式非递归汉诺塔 * @author zy *
- Mybatis无法获取带有下划线前缀的字段的值今天下面,把几张表里的字段都加了前缀,如 article_id,article_title,a
- 在linux主机部署Eureka高可用方案的时候,发现注册到服务中心的服务IP是随机的,由于主机的网卡是多个,随机的IP并不是自己想要的,上
- 本文实例讲述了java设计模式之工厂模式。分享给大家供大家参考,具体如下:工厂模式(factory)涉及到4个角色:抽象工厂类角色,具体工厂
- 什么是进程?当一个程序被打开运行时,它就是一个进程。在进程中包括线程,进程可以由一个或多个线程组成。什么是线程?线程是程序执行流的最小单元。
- step1:先移除centos自带的jdkrpm -qa|grep javarpm -e --nodeps xxstep2:安装jdk (所
- 一、导入和导出导入:通过解析excel表格中的数据,然后将数据放到一个集合中,接着通过对持久层操作,将数据插入到数据库中,再加载一下页面,从
- 这篇文章主要介绍了JDBC自定义连接池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 一、什么是抽象工厂模式为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。抽象工厂模式是所有形态的工厂模式中最为抽象和最具
- 本文实例讲述了Java计算文本MD5加密值的方法。分享给大家供大家参考,具体如下:java计算文本MD5值,用于加密import java.
- 先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK。。注意: