10.SpringBoot 统一处理功能

06-15 1566阅读

文章目录

  • 1.拦截器
    • 1.1在代码中的应用
      • 1.1.1定义拦截器
      • 1.1.2注册配置拦截器
      • 1.2拦截器的作用
      • 1.3拦截器的实现
      • 2.统一数据返回格式
        • 2.1 为什么需要统⼀数据返回格式?
        • 2.2 统⼀数据返回格式的实现
        • 3.统一异常处理
        • 4.SpringBoot专业版创建项目无Java8版本怎么办?

          大家好,我是晓星航。今天为大家带来的是 SpringBoot 统一处理功能 相关的讲解!😀

          1.拦截器

          拦截器(Interceptor)是一种特殊的组件,它可以在请求处理的过程中对请求和响应进行拦截和处理。拦截器可以在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。拦截器的主要目的是在不修改原有代码的情况下,实现对请求和响应的统一处理。

          HandlerInterceptor,拦截器的实现分为以下两个步骤:

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

          比如我们去银行办理业务,在办理业务前后,就可以加一些拦截操作

          办理业务之前,先取号,如果带身份证了就取号成功

          业务办理结束,给业务办理人员的服务进行评价

          这些就是"拦截器"做的工作

          1.1在代码中的应用

          拦截器的实现分两步:

          1.定义一个拦截器

          2.把拦截器注册到项目中

          10.SpringBoot 统一处理功能

          图书管理系统的拦截器:

          接口定义:

          10.SpringBoot 统一处理功能

          方法调用:

          10.SpringBoot 统一处理功能

          运行后,登录验证拦截器加入后运行结果:

          10.SpringBoot 统一处理功能

          1.1.1定义拦截器

          10.SpringBoot 统一处理功能

          1.1.2注册配置拦截器

          10.SpringBoot 统一处理功能

          10.SpringBoot 统一处理功能

          1.2拦截器的作用

          1. 权限控制:拦截器可以在请求到达处理器之前进行权限验证,从而实现对不同用户的访问控制。
          2. 日志记录:拦截器可以在请求处理过程中记录请求和响应的详细信息,便于后期分析和调试。
          3. 接口幂等性校验:拦截器可以在请求到达处理器之前进行幂等性校验,防止重复提交。
          4. 数据校验:拦截器可以在请求到达处理器之前对请求数据进行校验,确保数据的合法性。
          5. 缓存处理:拦截器可以在请求处理之后对响应数据进行缓存,提高系统性能。

          1.3拦截器的实现

          1.定义拦截器

          10.SpringBoot 统一处理功能

          2.注册配置拦截器

          10.SpringBoot 统一处理功能

          2.统一数据返回格式

          2.1 为什么需要统⼀数据返回格式?

          统⼀数据返回格式的优点有很多,⽐如以下⼏个:

          1. ⽅便前端程序员更好的接收和解析后端数据接口返回的数据。

          2. 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就⾏了,因为所有接口都是这样返回的。

          3. 有利于项⽬统⼀数据的维护和修改。

          4. 有利于后端技术部⻔的统⼀规范的标准制定,不会出现稀奇古怪的返回内容

          2.2 统⼀数据返回格式的实现

          统⼀的数据返回格式可以使⽤ @ControllerAdvice + ResponseBodyAdvice 的⽅式实现,具体实现代码如下:

          import org.springframework.core.MethodParameter;
          import org.springframework.http.MediaType;
          import org.springframework.http.server.ServerHttpRequest;
          import org.springframework.http.server.ServerHttpResponse;
          import org.springframework.web.bind.annotation.ControllerAdvice;
          import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyA
          dvice;
          import java.util.HashMap;
          @ControllerAdvice
          public class ResponseAdvice implements ResponseBodyAdvice {
           /**
           * 内容是否需要重写(通过此⽅法可以选择性部分控制器和⽅法进⾏重写)
           * 返回 true 表示重写
           */
           @Override
           public boolean supports(MethodParameter returnType, Class converterTyp
          e) {
           return true;
           }
           /**
           * ⽅法返回之前调⽤此⽅法
           */
           @Override
           public Object beforeBodyWrite(Object body, MethodParameter returnType,
          MediaType selectedContentType,
           Class selectedConverterType, ServerHttpR
          equest request,
           ServerHttpResponse response) {
           // 构造统⼀返回对象
           HashMap result = new HashMap();
           result.put("state", 1);
           result.put("msg", "");
           result.put("data", body);
           return result;
           }
          }
          

          10.SpringBoot 统一处理功能

          10.SpringBoot 统一处理功能

          只有String返回值会出现问题,int Integer Info对象 Result 返回值均没有问题。

          10.SpringBoot 统一处理功能

          10.SpringBoot 统一处理功能

          这里出现报错,主要是由于我们的body从String类型被getAdivce()方法转化为了Result类型,导致body在传参时与方法中的String s这个变量对应不上导致报错。

          3.统一异常处理

          统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice

          示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执⾏某个通知,

          也就是执⾏某个⽅法事件,具体实现代码如下:

          import java.util.HashMap;
          @ControllerAdvice
          public class ErrorAdive {
           @ExceptionHandler(Exception.class)
           @ResponseBody
           public Object handler(Exception e) {
           HashMap map = new HashMap();
           map.put("state", 0);
           map.put("data", null);
           map.put("msg", e.getMessage());
           return map;
           }
          }
          

          PS:⽅法名和返回值可以⾃定义,其中最重要的是 @ExceptionHandler(Exception.class) 注解。

          以上⽅法表示,如果出现了异常就返回给前端⼀个 HashMap 的对象,其中包含的字段如代码中定义的那样。

          我们可以针对不同的异常,返回不同的结果,⽐以下代码所示

          import org.springframework.web.bind.annotation.ControllerAdvice;
          import org.springframework.web.bind.annotation.ExceptionHandler;
          import org.springframework.web.bind.annotation.ResponseBody;
          import java.util.HashMap;
          @ControllerAdvice
          @ResponseBody
          public class ExceptionAdvice {
           @ExceptionHandler(Exception.class)
           public Object exceptionAdvice(Exception e) {
           HashMap result = new HashMap();
           result.put("success", -1);
           result.put("message", "总的异常信息:" + e.getMessage());
           result.put("data", null);
           return result;
           }
           @ExceptionHandler(NullPointerException.class)
           public Object nullPointerexceptionAdvice(NullPointerException e) {
           HashMap result = new HashMap();
           result.put("success", -1);
           result.put("message", "空指针异常:" + e.getMessage());
           result.put("data", null);
           return result;
           }
          }
          

          当有多个异常通知时,匹配顺序为当前类及其⼦类向上依次匹配,案例演示。

          在 UserController 中设置⼀个空指针异常,实现代码如下:

          @RestController
          @RequestMapping("/u")
          public class UserController {
           @RequestMapping("/index")
           public String index() {
           Object obj = null;
           int i = obj.hashCode();
           return "Hello,User Index.";
           }
          }
          

          以上程序的执⾏结果如下:

          10.SpringBoot 统一处理功能

          如果不加下面日志,那么在打印时,将不会由提示效果,异常输出信息就会不明显

          10.SpringBoot 统一处理功能

          4.SpringBoot专业版创建项目无Java8版本怎么办?

          更改了url之后

          10.SpringBoot 统一处理功能

          此时Java版本就有8了

          10.SpringBoot 统一处理功能

          此时SpringBoot也有2.x的版本了

          10.SpringBoot 统一处理功能

          需要确认的位置1:在设置里面搜索,看是否是jdk-1.8版本

          10.SpringBoot 统一处理功能

          需要确认的位置2:

          10.SpringBoot 统一处理功能

          需要确认位置3:

          10.SpringBoot 统一处理功能

          如果使用jdk-1.8,环境变量就改为jdk-1.8.0_192。

          如果使用jdk-7,环境变量就改为jdk-17.0.10

          感谢各位读者的阅读,本文章有任何错误都可以在评论区发表你们的意见,我会对文章进行改正的。如果本文章对你有帮助请动一动你们敏捷的小手点一点赞,你的每一次鼓励都是作者创作的动力哦!😘

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]