目录

  • 前言
  • 一丶用户登录权限效验
    • <1>最初用户登录验证
    • <2>Spring AOP 用户统一登录验证的问题
    • <3>拦截器
      • 拦截功能演示
    • <4>拦截器原理
    • <5>统一访问前缀添加
  • 二丶统一异常处理
    • <1>重改1/0异常
    • <2>重改登录异常
    • <3>写法小梳理
  • 三丶统一数据格式封装
    • <1>为什么需要统一的数据格式封装呢?
    • <2>怎么实现呢?

前言

接下来是 Spring Boot 统一功能处理模块了,也是 AOP 的实战环节,要实现的课程目标有以下 3 个:

  1. 统一用户登录权限验证;
  2. 统一数据格式返回;
  3. 统一异常处理。

一丶用户登录权限效验

用户登录权限的发展从之前每个方法中自己验证用户登录权限,到现在统一的用户登录验证处理,它是 一个逐渐完善和逐渐优化的过程。

<1>最初用户登录验证

我们先来回顾一下最初用户登录验证的实现方法:

@RestController
@RequestMapping("/user")
public class UserController {/*** 某方法 1*/@RequestMapping("/m1")public Object method(HttpServletRequest request) {// 有 session 就获取,没有不会创建HttpSession session = request.getSession(false);if (session != null && session.getAttribute("userinfo") != null) {// 说明已经登录,业务处理return true;} else {// 未登录return false;}}/*** 某方法 2*/@RequestMapping("/m2")public Object method2(HttpServletRequest request) {// 有 session 就获取,没有不会创建HttpSession session = request.getSession(false);if (session != null && session.getAttribute("userinfo") != null) {// 说明已经登录,业务处理return true;} else {// 未登录return false;}}// 其他方法...
}

这是我们刚开始的用法,就是刚刚学习完SpringBoot时候的用法,用Session来判断当前的登录状态。但是问题是什么呢?
1. 每个方法中都要单独写用户登录验证的方法,即使封装成公共方法,也一样要传参调用和在方法中进行判断。
2. 添加控制器越多,调用用户登录验证的方法也越多,这样就增加了后期的修改成本和维护成本。
3. 这些用户登录验证的方法和接下来要实现的业务几何没有任何关联,但每个方法中都要写一遍。
所以就很麻烦,但是小伙伴们灵机一动,诶,上节课不是学了AOP吗?刚才切面编程是处理这个问题的好手呀

<2>Spring AOP 用户统一登录验证的问题

竟我们上节课刚学,但是这里有一个问题

然后就又有小伙伴说了,我们可以这么写呀

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class UserAspect {// 定义切点方法 controller 包下、子孙包下所有类的所有方法@Pointcut("execution(* com.example.demo.controller..*.*(..))")public void pointcut(){ }// 前置方法@Before("pointcut()")public void doBefore(){}// 环绕方法@Around("pointcut()")public Object doAround(ProceedingJoinPoint joinPoint){Object obj = null;System.out.println("Around 方法开始执行");try {// 执行拦截方法obj = joinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}System.out.println("Around 方法结束执行");return obj;}
}

对,没错,你是判断了是否登录,但是,是有问题的!

<3>拦截器

对于以上问题 Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤:

  1. 创建自定义拦截器,实现 HandlerInterceptor 接口的 preHandle(执行具体方法之前的预处理)方法。
  2. 将自定义拦截器加入 WebMvcConfigurer 的 addInterceptors 方法中。

如下

拦截功能演示

首先,我们原本的代码是没有登录验证的,这里先随便写一个登录功能


然后开始书写我们的拦截器






嗯?怎么回事?怎么回事空呢?这没有道理,但是仔细想想,我们当前的代码,是在AOP基础上书写的,然后前面的AOP代码有没有什么问题,仔细一想,好像有点!





<4>拦截器原理

所有的 Controller 执行都会通过一个调度器 DispatcherServlet 来实现,这一点可以从 Spring Boot 控制台的打印信息看出,如下图所示:

而所有方法都会执行 DispatcherServlet 中的 doDispatch 调度方法。
执行 Controller 之前,会先调用 预处理方法 applyPreHandle,而applyPreHandle 方法的实现源码如下:

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse
response) throws Exception {for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex =
i++) {// 获取项目中使用的拦截器 HandlerInterceptorHandlerInterceptor interceptor =
(HandlerInterceptor)this.interceptorList.get(i);if (!interceptor.preHandle(request, response, this.handler)) {this.triggerAfterCompletion(request, response, (Exception)null);return false;}}return true;
}

从上述源码可以看出,在 applyPreHandle 中会获取所有的拦截器 HandlerInterceptor 并执行拦截器中
的 preHandle 方法,这样就会咱们前面定义的拦截器对应上了,

<5>统一访问前缀添加

这个是个挺简单的语法



那可能会有铁子问了,你这么搞的意义在哪里呢?还特意加个访问前缀

二丶统一异常处理

统一异常处理使用的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件
此时我们给个异常事件

这个时候应该会有一个异常信息

但是此时,就很难受不是嘛?我们换种方法来写

这种也可以,可是就很不现实不是嘛?一个错误来一个异常?每个错误都给你加一个?

看我下面的写法,当前类加上@ControllerAdvice注解

此时打印信息如下:

<1>重改1/0异常



<2>重改登录异常

所以这里修改一下登录报错的信息



<3>写法小梳理

三丶统一数据格式封装

<1>为什么需要统一的数据格式封装呢?

统一数据返回格式的优点有很多,比如以下几个:
1. 方便前端程序员更好的接收和解析后端数据接口返回的数据。
2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就行了,因为所有接口都是这样返回
的。
3. 有利于项目统一数据的维护和修改。
4. 有利于后端技术部门的统一规范的标准制定,不会出现稀奇古怪的返回内容。

如果感觉有点迷的话,那就不看上面这个,看我下面的图示

<2>怎么实现呢?

这个不难,看我下面图示的步骤

然后之后返回的内容如下

然后到了这里,就讲完啦,不对,还有个问题要忘了说了

就是返回值不能是你要统一返回的不能是null值嗷

7天学完Spring:AOP实战,SpringMVC统一处理相关推荐

  1. Spring AOP 实战运用

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  2. Spring Cloud实战Zuul统一异常处理

    Spring Cloud实战Zuul统一异常处理 Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用.我们会发现在这些核心过滤器中并没有实现erro ...

  3. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  4. 【struts2+hibernate+spring项目实战】统一异常处理(ssh)

    一.概述 在项目中总会出现各种异常.bug,为了使得用户体验更好,当系统出现异常的时候,我们需要有我们的处理方式,使得用户能够理解系统出现了什么问题. 二.异常类 首先我们需要编写一个异常类 pack ...

  5. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  6. java任务调度定时器,从零开始学 Java - Spring 使用 Quartz 任务调度定时器

    生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...

  7. Spring AOP是什么?你都拿它做什么?

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 转自:我叫刘半仙, https://my.oschina.net/liughDevelop/blo ...

  8. modelandview使用过程_面试问烂的 Spring AOP 原理、Spring MVC 过程

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:莫那一鲁道链接:www.jianshu.com/p/e18fd44964eb Spring AOP ,SpringMVC ,这两个应该 ...

  9. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

最新文章

  1. 射频放大器芯片3阶截点计算与芯片选择
  2. 使用线程池时一定要注意的五个点
  3. STL容器汇总(一)
  4. boost::mpl模块实现print相关的测试程序
  5. js(Dom+Bom)第八天
  6. ASP.NET Core文件上传与下载(多种上传方式)
  7. nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM
  8. 荣耀6plus+android5.1,荣耀66Plus EMUI3.0开发版5.5.1版本发布说明
  9. java基于ssm的房屋租赁管理系统
  10. 怎样开启Win7快速启动栏
  11. 【基于Android的连连看游戏的设计与实现】
  12. 日历控件CalendarView的使用
  13. 跌倒检测_使用姿势估计的跌倒检测
  14. Gstreamer中pad的链接
  15. 给定一个arr,里面的数字都是0~9,你可以随意使用arr中的数字,哪怕打乱顺序也行, 请拼出一个能被3整除的最大的数字,用str形式返回。
  16. css margin缩写简写
  17. 微信小程序开发---连接云开发数据库,实现数据获取
  18. 诊断功能第一讲-诊断基础知识
  19. 人脸识别中的八大难题(zz)
  20. 关于嵌入式系统的启动(装载)

热门文章

  1. 笔记本电脑操作失灵:开始菜单、鼠标点击、应用程序等打开自动关闭
  2. SegmentFault 社区访谈 | 有明,不仅仅是死亡诗社的程序猿
  3. 吾空K5S笔记本开机蓝屏怎么U盘重装系统
  4. html5carousel图片轮播,全面解析Bootstrap中Carousel轮播的使用方法
  5. 干货丨时序数据库DolphinDB客户端软件教程
  6. 电脑键盘各个按键作用讲解
  7. 渗透之——SQL语句生成一句话
  8. window 重装系统学习
  9. 快速熟悉Java -- 《电玩游戏Java实战DIY》
  10. 关于这次KPL春季决赛的感悟