SpringBoot统一功能的处理

目录

SpringBoot拦截器

自定义拦截器

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

统一异常处理

创建异常处理类

 实现业务方法

统一数据返回格式

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

统一数据返回格式的实现

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


SpringBoot拦截器

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

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

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

自定义拦截器

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

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

SpringBoot统一功能的处理_第1张图片

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

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

SpringBoot统一功能的处理_第2张图片

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

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

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

SpringBoot统一功能的处理_第3张图片

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


统一异常处理

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

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

创建异常处理类

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

SpringBoot统一功能的处理_第4张图片

 实现业务方法

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

SpringBoot统一功能的处理_第5张图片

 访问接口出现空指针的时候返回的状态码是200,响应字段就是我们设置的三个字段.这样就会给前端明确的信息.SpringBoot统一功能的处理_第6张图片

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

SpringBoot统一功能的处理_第7张图片

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


统一数据返回格式

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

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

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

统一数据返回格式的实现

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

SpringBoot统一功能的处理_第8张图片

SpringBoot统一功能的处理_第9张图片 


返回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去掉

SpringBoot统一功能的处理_第10张图片

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

SpringBoot统一功能的处理_第11张图片

 

你可能感兴趣的:(spring,boot,java,spring)