⭐️前言⭐️
这篇文章主要介绍Spring Boot的统一功能处理模块,也是AOP的实战环节。
欢迎点赞 收藏 ⭐留言评论 私信必回哟
博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
博客中涉及源码及博主日常练习代码均已上传GitHub
在学习Spring AOP之前,用户登录权限的验证是由每个方法中自己验证。
而学习了Spring AOP之后,可以通过Spring AOP的前置通知或环绕通知来实现,具体实现代码如下:
但如果在以上Spring AOP的切面中实现用户权限效验的功能,有以下两个问题:
1.没办法获取到HttpSession对象。
2.我们要对一部分方法进行拦截,而另一部分方法不拦截,如注册方法和登录方法是不拦截的,这样的话排除方法的规则很难定义,甚至没办法定义。
要解决上述问题,就需要使用下边的Spring拦截器:
对于以上问题Spring中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤:
1、创建自定义拦截器,实现 HandlerInterceptor
接口的perHandle
(执行具体方法之前的预处理)方法。
2、将自定义拦截器加入 WebMvcConfiger
的 addInterceptors
方法中。
具体实现如下:
将上一步中的自定义拦截器加入到系统配置信息中,具体实现代码如下:
其中:
**
表示拦截任意方法(也就是所有方法)说明:以上拦截规则可以拦截此项目中使用的URL,包括静态文件(图片文件、JS和CSS等文件)。
在用户调用Controller
的方法之前,拦截器进行预处理,符合条件才会进一步调用Controller
层的方法。
Spring 中的拦截器也是通过动态代理和环绕通知的思想实现的,大体的调用流程如下:
而 spring 中的动态代理的实现有包含了 2 种:
在我们的程序出错时,前端可能根本不知道是由于什么原因,而导致程序不能正常运行,所以我们就需要通过统一异常的处理方式,使得前端获取到程序异常的具体原因,进而使得程序员更好的解决问题。
统一异常处理使用的是@ControllerAdvice
+@ExceptionHandler
来实现的,@ControllerAdvice
表示控制器通知类,@ExceptionHandler
是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件,具体实现代码如下:
方法名和返回值可以自定义,其中最重要的是@ExceptionHandler(Exception.class)注解。
以上方法表示,如果出现了异常,就可以返回给前端一个HashMap对象,我们也可以针对不同的异常返回不同的结果,具体执行的异常通知符合当前异常向上依次匹配的规则。
在浏览器中输入127.0.0.1:8080/user/reg
,查看统一异常处理后的执行效果,可以发现,之前返回的是执行了 reg 方法
,但现在如果程序再因为异常原因不能正常运行,前端就会获取到异常的原因了。
统一的数据返回格式可以使用@ControllerAdvice
+ResponseBodyAdvice
的方式实现,具体实现代码如下:
在浏览器输入127.0.0.1:8080/user/login
,在统一数据格式之前,前端页面接收到的参数为布尔类型true/false
,而现在返回的就是统一格式的数据了。
WebMvcConfigurer
+HandlerInterceptor
来实现@ControllerAdvice
+@ExceptionHandler
来实现@ControllerAdvice
+ResponseBodyAdvice
来处理⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正