SpringBoot统一功能处理

news/2025/4/2 5:11:37/

目录

  • springBoot拦截器 实现 统一用户登录权限验证
    • 1. 自定义拦截器
    • 2. 将自定义拦截器配置到系统配置项,并设置合理的拦截规则
    • 拦截器实现原理
  • 统一异常处理
  • 统一数据格式返回

统一用户登录权限验证
统一数据格式返回
统一异常处理

springBoot拦截器 实现 统一用户登录权限验证

1. 自定义拦截器

//自定义拦截器
public class LoginInterceptor implements HandlerInterceptor {//调用目标方法之前执行的方法//此方法返回 boolean 类型的值:// 如果返回的是true 表示(拦截器)验证成功,继续走后续的流程,执行目标方法;// 如果返回false,表示拦截器执行失败,验证未通过,后续的流程和目标方法不要执行了@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//用户登录的判断业务HttpSession session = request.getSession(false);if (session != null && session.getAttribute("session_userinfo") != null) {//用户已经登陆return true;}
//        response.sendRedirect("https://www.baidu.com");response.setStatus(401);return false;}
}

2. 将自定义拦截器配置到系统配置项,并设置合理的拦截规则

package com.example.demo.config;import com.example.demo.common.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MyConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//        registry.addInterceptor(new LoginInterceptor());  // 都可以,推荐使用注入的方式registry.addInterceptor(loginInterceptor).addPathPatterns("/**")   //  /** 拦截所有的url,  /* 一级  /** 多级.excludePathPatterns("/user/login")  // 排除url/user/login 不拦截该路径.excludePathPatterns("/user/reg").excludePathPatterns("/image/**");  //排除 image 文件夹下的所有文件}
}

拦截器实现原理

在这里插入图片描述

统一异常处理

  1. 创建一个异常处理类
@ControllerAdvice
public class MyExceptionAdvice {
}
  1. 创建异常检测的类和处理业务方法
@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {///处理空指针异常@ExceptionHandler(NullPointerException.class)public HashMap<String, Object> doNullPointerException(NullPointerException e) {HashMap<String, Object> result = new HashMap<>();result.put("code", -1);result.put("msg", "空指针:" + e.getMessage());result.put("data", null);return result;}
}
//默认异常处理//当具体的异常匹配不到时,会执行此方法@ExceptionHandler(Exception.class)public HashMap<String, Object> doException(Exception e) {HashMap<String, Object> result = new HashMap<>();result.put("code", -1);result.put("msg", "Exception:" + e.getMessage());result.put("data", null);return result;}

统一数据格式返回

统一数据格式返回的优点:

  1. 降低前端和后端沟通的成本
  2. 方便前端程序员和后端程序员写公共的代码

统一数据格式返回(强制性统一数据返回)【在返回数据之前进行数据重写】:


//统一数据格式处理
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {//实现 ResponseBodyAdvice 接口 必须重写 supports 和 beforeBodyWrite 方法//内容是否需要重写/*** 是否执行 beforeBodyWrite 方法,true执行,重写返回结果* @param returnType* @param converterType*/@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}/*** 返回数据之前进行数据重写* @param body  原始返回值* @param returnType**/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 先定义:标准返回格式为 HashMap<String, Object>  ->  code,msg,dataif (body instanceof HashMap) {return body;}//重写返回结果,让其返回一个统一的数据格式HashMap<String, Object> result = new HashMap<>();result.put("code", 200);result.put("msg", "");result.put("data", body);return result;}
}

统一数据格式返回在遇到String类型返回时会报错:

    @RequestMapping("/sayHi")public String sayHi() {return "say hiiii";}
    @ExceptionHandler(Exception.class)public HashMap<String, Object> doException(Exception e) {HashMap<String, Object> result = new HashMap<>();result.put("code", -300);result.put("msg", "Exception:" + e.getMessage());result.put("data", null);return result;}

在这里插入图片描述
执行流程:

  1. 方法返回的是String类型
  2. 统一数据返回之前的处理,会将String转成HashMap
  3. 将HashMap转换成 application / json 字符串给前端(接口)

报错发生在第三步。
判断原body的类型:

  1. 如果是string,使用StringHttpMessageConverter进行类型转换 – 出错
  2. 不是string,使用HttpMessageConverter进行类型转换

解决方案:

  1. 将 StringHttpMessageConverter 通过项目的配置文件,从项目当中去除掉
  2. 在统一数据重写时,单独处理String类型,让其返回一个String 字符串,而非HashMap。【常用】

解决方案2的两种写法
一、 在最开始先判断是否为string类型,手动写成json格式

 @Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//先判断是不是 string 类型if (body instanceof String) {// 返回一个 String 字符串return "{\"code\":200,\"msg\": \"\", \"data\":\"" + body + "\"}";}// 先定义:标准返回格式为 HashMap<String, Object>  ->  code,msg,dataif (body instanceof HashMap) {return body;}//重写返回结果,让其返回一个统一的数据格式HashMap<String, Object> result = new HashMap<>();result.put("code", 200);result.put("msg", "");result.put("data", body);return result;}

二、使用ObjectMapper ,objectMapper.writeValueAsString(result),将对象转化成string

    @Autowiredprivate ObjectMapper objectMapper;@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 先定义:标准返回格式为 HashMap<String, Object>  ->  code,msg,dataif (body instanceof HashMap) {return body;}HashMap<String, Object> result = new HashMap<>();result.put("code", 200);result.put("msg", "");result.put("data", body);if (body instanceof String) {return objectMapper.writeValueAsString(result);  //将对象转化成string}return result;}

解决方案1:移除StringHttpMessageConverter
在这里插入图片描述

package com.example.demo.config;import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);}
}

http://www.ppmy.cn/news/69102.html

相关文章

2023最新CleanMyMac中文版系统清理优化工具

CleanMyMac中文版功能非常的强大&#xff0c;操作简单&#xff0c;使用起来高效快捷&#xff0c;软件自身拥有一个安全数据&#xff0c;且拥有一定的规格&#xff0c;CleanMyMac中文版能够确定软件能够正确选择和清理Mac垃圾文件&#xff0c;更加安全&#xff0c;可靠。一键快速…

【2023华为OD笔试必会25题--C语言版】《13 获得完美走位》——字符串、滑窗

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…

Java入门和背景知识

&#x1f525;常见编程语言介绍&#x1f525;Java 发展史&#x1f525;Java 的核心优势&#x1f525;Java 各版本的含义&#x1f525;Java 的特性和优势&#x1f525;Java 运行机制&#x1f525;JVM、JRE 和 JDK&#x1f525;Java 开发环境搭建&#x1f525;openJDK 和 JDK 收费…

修复bug:FlexibleButton id相反问题

目录 版本&#xff1a;https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1 问题现象 问题描述 查源码&#xff01; 注册 读按键 按键处理 小结 版本&#xff1a;https://github.com/murphyzhao/FlexibleButton/releases/tag/2.0.1https://github.com/mur…

shell脚本——流编辑器“三剑客”之sed命令

shell脚本——流编辑器“三剑客”之sed命令 一、流编辑器“三剑客”二、sed编辑器1、sed的工作流程2、命令格式3、常用选项4、常用操作5、打印内容6、使用地址7、删除行8、替换9、插入 一、流编辑器“三剑客” sed awk grep 二、sed编辑器 sed是一种流编辑器&#xff0c;流编…

Liunx top 命令详解

文章目录 top补充说明语法选项top交互命令实例 top 显示或管理执行中的程序 补充说明 top命令 可以实时动态地查看系统的整体运行情况&#xff0c;是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面&#xff0c;用热键可以管理。 语法…

HttpClient

介绍 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议。 作用&#xff1a; 发送HTTP请求 接收响应数据 应用场景&#xff1a; …

Web的块级元素、行内元素和行内块元素区别、联系和相互转化

Web中&#xff0c;HTML元素可以分为三种类型&#xff1a;块级元素、行内元素和行内块元素。 名词解释 块级元素 是指在页面上以块的形式展现&#xff0c;单独占据一行或多行空间&#xff0c;如div、p、h1等。这些元素默认情况下会从上到下排列&#xff0c;同时宽度会自动填满…