SpringBoot统一功能的处理

news/2024/10/30 21:31:04/

目录

SpringBoot拦截器

自定义拦截器

将自定义拦截器加入系统配置项

统一异常处理

创建异常处理类

 实现业务方法

统一数据返回格式

为什么需要统一数据返回格式

统一数据返回格式的实现

返回String时的报错愿意及处理方案


SpringBoot拦截器

使用SpringBoot拦截器来实现用户登录权限的校验.

如果使用SpringAOP来实现用户登录权限的校验会有两个问题:没办法获取到HttpSession对象;要对一部分方法进行拦截,一部分方法不进行拦截比如注册方法和登录方法,这样的话排除方法的规则很难定义,甚至没办法定义.

SpringBoot拦截器的实现分为两大步:自定义拦截器和将自定义拦截器加入到系统配置项.

自定义拦截器

创建自定义的拦截器,实现HandlerInterceptor接口的prehandle(执行目标方法之前的预处理方法)方法.

这里主要演示拦截器的实现,在项目中我们一般在返回false前要向前端返回特定json字符串来阐述此次交互是否成功,如果失败,失败的原因是什么.

将自定义拦截器加入系统配置项

将自定义拦截器加入WebMvcConfigurer的addInterceptors方法中.

addPathPatterns表示要拦截的url,"**"则表示拦截所有的方法.
excludePathPatterns表示要排除的url.

以上的拦截规则可以拦截此项目中使用的url包括静态文件(图片文件,js,css等).

加入了拦截器之后,程序正常的调度顺序:

小结:SpringBoot拦截器实现原理是基于SpringMVC框架的拦截器机制,当客户端发送请求时,请求会经过一系列的组件处理,其中就包括拦截器.


统一异常处理

进行统一异常处理就是为了无论后端程序是怎么执行的,都要给前端一个正常的响应.

实现统一的异常处理分为两步:创建一个异常处理的类和实现异常检测的处理方法.

创建异常处理类

加@ControllerAdvice注解就会监测到整个项目中的异常,并且也会有@Controller注解的功能.

 实现业务方法

这是一个处理空指针异常的方法,在捕捉到项目中的空指针异常的时候就会触发此异常处理方法,方法的业务代码是由程序员自主实现的,返回给前端特定字段.在项目中我们会实现统一的数据格式返回.在这里只是使用HashMap构造了三个字段.

 访问接口出现空指针的时候返回的状态码是200,响应字段就是我们设置的三个字段.这样就会给前端明确的信息.

我们还要在类里实现一个匹配所有异常的方法

这就是默认的异常处理,当具体的异常匹配不到的时候,会执行此方法.


统一数据返回格式

为什么需要统一数据返回格式

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

统一数据返回(强制性统一数据返回),会在返回数据之前进行数据的重写,这是一种保底策略.

统一数据返回格式的实现

统一数据返回格式使用@ControllerAdvice和ResponseBodyAdvice的方式实现.在数据返回给前端之前进行数据的重写,参数里的body就是controller方法里返回的结果(原返回值).

 


返回String时的报错愿意及处理方案

当统一数据格式返回遇到原body是String的时候会报错:

说的是hashmap不能转换成string.

出现这个问题的原因是:返回的执行流程是分为三步的.

1.方法返回的是string

2.统一数据返回之前处理:String转换成HashMap

3.将HashMap转换成application/json字符串给前端(接口)

那么出现这个问题的原因就在第三步上.在执行第三步的时候会先判断原body的类型,如果是string就会使用StringHttpMessageConverter进行转换,不是string就使用HttpMessageConverter进行类型转换.在这个地方,如果是string了,就会使用尝试StringHttpMessageConverter把第二部的HashMap转成String JSON字符串,这样就出错了.判断是用的原body,转换是用的HashMap.

这样就会报出HashMap不能转换成String的错误.

解决方案:

1.将StringHttpMessageConverter去掉

2.在统一数据重写的时候,单独处理string类型,让其返回一个string字符串,而非HashMap.

 


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

相关文章

Python数据攻略-Pandas的数据计算和清洗整理

大家好,我是Mr数据杨,今天带大家以《三国演义》为背景,探索Python数据处理的奥秘。 将眼光投向谋士们,他们就如同Python的算术运算和NumPy、SciPy函数,精准的计算和预测是他们的必备技能。比如,郭嘉分析敌…

1g等于多少N?

1g0.0098N 所以设备的精度要达到0.00001N. 10^-5N

1MB等于多少字节

1TB1024GB 1GB1024MB 1MB1024KB 1KB1024Byte 注:Byte就是B也就是字节 所以1MB=1024*1024=1048576字节

6-24V输入升压10-36V升压芯片内置MOS大功率1A

在许多应用场合,都需要将低电压升至适合用电设备使用的较高电压。如单节和双节锂电池供电电路,常需要将其2.8~4.2V的低电压升至可供使用的5V,9V,12V,甚至更高的电压。再如双节锂电池6.0V-8.4V电压升压到9V,12V,15V,20V…

关于安全人体安全电流的一些数值

对人体安全造成危险或者致命的最大电流水平是多少?这个问题有多个答案,要看电流作用于人体那个部位和对人体有什么不利的影响。 标准线路电压(110/230 伏;50 或 60 赫兹 (Hz))穿过胸部,即使是几分之一秒&am…

台式计算机通过电流,一台台式电脑正常工作的时候电流是多少安?谢谢

满意答案 lostjun 2019.09.27 采纳率:47% 等级:9 已帮助:260人 2. CPU: 3.3V 核心电压 1.05-1.55V 3.存:DDR 2.6V,2.5V DDR 2 1.8V 4.硬盘: 12V 5V 5.光驱: 12V 5V 6.显卡: 12V 3.3V 1.5V 7.…

1 oZ等于多少mil?

关于铜厚,有基铜和成品铜厚之分. 基铜是指拿来做板的原材料的铜厚,成品铜厚是指最终做好的PCB板的铜厚.由于外层需要电镀,电镀通常会使铜厚增加0.5OZ.也就是外层基铜是0.5OZ,那么外层成品铜厚就是1OZ,如果外层基铜是1OZ,那么外层成品铜厚就是1.5OZ,如果外…

1vrms等于多少伏

Vrms指的电压的有效值,电压峰值理论可以无限高,换成VDC就等于20V。vrms是电压的均方根,表示交流信号的有效值或有效直流值。不能视为一种单位,应该是一种电压参数。对于正弦波,vrms是指正弦交流信号的。 Vrms是指电压的…