SpringBoot 统⼀功能处理

news/2024/11/17 6:42:14/

目录

SpringBoot 统一功能处理概念

统一用户登录权限验证

登录功能代码 

Spring拦截器实现步骤:

 统一项目访问前缀

第一种方法:重写configurePathMatch方法进行配置

 第二种方法:在系统的配置文件.properties中进行配置

统一异常处理返回

统一数据格式返回


SpringBoot 统一功能处理概念

SpringBoot 统一功能处理就是AOP思想的实战环节,接下来就开始讲解SpringBoot 统一功能实战处理了。

SpringBoot 统一功能实现主要是实现以下功能:

1、统一用户登录权限验证(使用拦截器实现)

2、统一数据格式返回

3、统一异常处理返回

统一用户登录权限验证

        在原来进行用户登录权限验证时 ,需要在每一个方法体中进行登录方法的验证,代码十分的麻烦。于是就出现了Spring AOP思想,可以进行统一登录权限验证,但是原生Spring AOP实现统一拦截的难点就在于:

1、定义拦截的规则(表达式)非常难;

2、在切面类中拿到HttpSession比较难。

        因此在该背景下于是就出现了Spring拦截器。

登录功能代码 

@RequestMapping("/hi")
@RestController
public class controller {@RequestMapping("/getLogin")public String Login(){System.out.println("执行了login~~");return "login~~";}@RequestMapping("/getUser")public String User(){System.out.println("执行了user~~");return "user~~";}@RequestMapping("/getReg")public String reg(){System.out.println("执行了reg~~");return "reg~~";}}

Spring拦截器实现步骤:

1、实现HandlerInterceptor接口并且重写preHeadler方法,在方法中编写自己的业务代码

public class LoginInter implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 用户登录效验HttpSession session = request .getSession(false);if(session != null && session.getAttribute("userInfo") != null){// 说明用户已经登录return true;}// 执行到这里说明用户未登录,既可以设置跳转到登录界面进行重新登录response.sendRedirect("/login.html");return false;}
}

2、将拦截器添加到配置文件中,并且设置拦截规则

        1.添加注解:@Configuration

        2.实现WebMvcConfigurer接口并重写addInterceptors方法

        3.使用 addPathPatterns确定哪些需要拦截的方法,excludePathPatterns为不拦截哪些URL(**表示拦截所有的方法)

代码如下

@Configuration
public class config implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInter()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/hi/getLogin") // 不拦截该请求URL.excludePathPatterns("/hi/getReg") // 不拦截该请求URL.excludePathPatterns("/**/*.html"); // 不拦截所有的html页面}
}

 

 以上代码未拦截URL为 "/hi/getLogin""/hi/getReg""/**/*.html", 而是拦截了URL为"/hi/getUser",并且自动跳转到了登录界面login.html

不加拦截器效果

 加了拦截器,会在调⽤ Controller 之前进⾏相应的业务处理,执⾏的流程如下图

 统一项目访问前缀

第一种方法:重写configurePathMatch方法进行配置

 @Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {configurer.addPathPrefix("hello",c->true);}

 

 第二种方法:在系统的配置文件.properties中进行配置

# 配置统一访问前缀
server.servlet.context-path=/hello

 配置后如果使用原来的URL就会报404错误,此时需要添加前缀/hello进行访问

 

 

统一异常处理返回

当后端发生异常时,需要返回异常通知到前端,方便前端接收识别到异常并进行处理。因此就需要后端返回统一的异常提交给前端,否则前端会无法识别到后端返回的异常错误

示例:当后端发生空指针异常时

  @RequestMapping("/login")public String Login(){int a = 100/0;System.out.println("执行了login~~");return "login~~";}

 

此时我们需要返回一个统一的异常格式json给前端

步骤:

1.创建一个类,并在类上标明@ControllerAdvice

2.添加方法@ExceptionHandler来订阅异常

@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个通知,执行某个方法事件
@ControllerAdvice
@ResponseBody
public class ErrorException {@ExceptionHandler(Exception.class)public HashMap<String,Object> exception(Exception e){HashMap<String,Object> result = new HashMap<>();result.put("code","-1"); // 状态码result.put("emg",e.getMessage());  // 错误码描述信息result.put("data",null);return result;}}

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

统一数据格式返回

统一数据格式返回可以更好的方便前端接收和解析后端返回的数据,可以大大加快工作效率

步骤:

1.在类上添加注解:@ControllerAdvice

2.实现接口ResponseBodyAdvice并且必须重写supportsbeforeBodyWrite这两个方法

@ControllerAdvice
public class Advice implements ResponseBodyAdvice {/**重写support和beforeBodyRead两个方法* */@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;  // 返回true 则执行下面的beforeBodyWrite,否则不执行}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {HashMap<String,Object> map = new HashMap<>(); // 返回数据格式为哈希map格式map.put("code",200); // 状态码map.put("message","");map.put("data",body);return map;}
}

后端返回给前端数据为数字和字符串形式

controller代码如下:

    @RequestMapping("/num")public Integer getNum(){return new Random().nextInt(100); // 后端传递100以内的随机数字给前端}@RequestMapping("/char")public String getString(){return "hello,world"; //后端传递字符串"hello,world"给前端}

后端传递数字给前端,结果正常显示

 后端传递"hello,world"字符串给前端,结果错误显示

原因:HashMap 转换成字符串出现异常,因为字符串是一个特殊的类型,需要借助jakson的转换工具来进行HashMap 转换成字符串

 添加jaskon代码如下:

if(body instanceof String){ // instanceof 为判断数据类型try {return objectMapper.writeValueAsString(map); // 将HashMap 转换成字符串类型} catch (JsonProcessingException e) {e.printStackTrace();}}

 

再次运行项目,此时后端将hello,world字符串就成功传递给前端了

 


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

相关文章

Linux网络-网络层IP协议

目录 IP协议 计算机网络分层 IP协议头格式 IP数据报 - 数据分片 数据报为什么要分片&#xff1f; 数据报分片是什么&#xff1f; 如何做到IP数据报分片&#xff1f; 分片demo示例 并不推荐分片&#xff0c;能不分片则不分片。 网段划分 前置了解 网络号和主机号 为…

Flutter的文本、图片和按钮使用

像视图数据流转机制、底层渲染方案、视图更新策略等知识&#xff0c;都是构成一个UI框架的根本&#xff0c;看似枯燥&#xff0c;却往往具有最长久的生命力。 因此&#xff0c; 只有把这些最基础的知识弄明白&#xff0c;修好内功&#xff0c;才能触类旁通&#xff0c;由点及面…

带你了解电视技术OLED vs QLED,速戳~

什么是OLED&#xff1f; OLED&#xff08;Organic Light-Emitting Diode&#xff0c;有机发光二极管&#xff09;是LG主推的一种面板技术&#xff0c;在每一个有机发光二极体连接导体&#xff0c;发光单元依照电晶体接到的电流点亮&#xff0c;通过得电流越强&#xff0c;OLED…

C++11 线程库—线程操作(更新中)

前言 在C11推出线程库前&#xff0c;Windows和Linux操作系统的线程操作并不同&#xff0c;这就导致多线程程序无法跨平台&#xff0c;如果想要跨平台&#xff0c;会很麻烦并且容易出错。C11推出的线程库就解决了这一问题。 因为在Windows和Linux操作系统中有一些独特的常量&am…

基于卷积神经网络的高光谱图像分类

文章目录 引言1. 基于光谱特征2. 基于空间特征3. 基于空谱特征3.1 空间特征和光谱特征的融合3.2 基于3D-CNN分类 4. 总结 引言 近年来深度学习的技术在计算机视觉领域中大放异彩&#xff0c;使得对多光谱数据分类的研究迅速发展&#xff0c;结合2D-CNN&#xff0c;3D-CNN&…

强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

【Seaborn系列教程】二、基本图表

Seaborn基本图表 Seaborn是一个Python数据可视化库,它构建在Matplotlib之上,并使创建各种类型的图表变得更加容易。Seaborn提供了许多内置的图表类型,包括折线图、散点图、直方图、条形图和箱线图等。 在本文中,我们将介绍如何使用Seaborn创建这些基本图表,并探讨一些可…

Win7 64位 VS2015及MinGW环境编译矢量库agg-2.5和cairo-1.14.6

书接上文&#xff0c;昨天装了MinGW&#xff0c;主要原因之一是要用到MSYS&#xff0c;所以顺手把FFMPEG又编译了一遍。 回到主题&#xff0c;其实我是想编译矢量库&#xff0c;因为最近要学习一些计算几何算法&#xff0c;所以找个方便的2D画图库就很重要。 说白了其实是懒得…