目录
SpringBoot拦截器
自定义拦截器
将自定义拦截器加入系统配置项
统一异常处理
创建异常处理类
实现业务方法
统一数据返回格式
为什么需要统一数据返回格式
统一数据返回格式的实现
返回String时的报错愿意及处理方案
使用SpringBoot拦截器来实现用户登录权限的校验.
如果使用SpringAOP来实现用户登录权限的校验会有两个问题:没办法获取到HttpSession对象;要对一部分方法进行拦截,一部分方法不进行拦截比如注册方法和登录方法,这样的话排除方法的规则很难定义,甚至没办法定义.
SpringBoot拦截器的实现分为两大步:自定义拦截器和将自定义拦截器加入到系统配置项.
创建自定义的拦截器,实现HandlerInterceptor接口的prehandle(执行目标方法之前的预处理方法)方法.
这里主要演示拦截器的实现,在项目中我们一般在返回false前要向前端返回特定json字符串来阐述此次交互是否成功,如果失败,失败的原因是什么.
将自定义拦截器加入WebMvcConfigurer的addInterceptors方法中.
addPathPatterns表示要拦截的url,"**"则表示拦截所有的方法.
excludePathPatterns表示要排除的url.
以上的拦截规则可以拦截此项目中使用的url包括静态文件(图片文件,js,css等).
加入了拦截器之后,程序正常的调度顺序:
小结:SpringBoot拦截器实现原理是基于SpringMVC框架的拦截器机制,当客户端发送请求时,请求会经过一系列的组件处理,其中就包括拦截器.
进行统一异常处理就是为了无论后端程序是怎么执行的,都要给前端一个正常的响应.
实现统一的异常处理分为两步:创建一个异常处理的类和实现异常检测的处理方法.
加@ControllerAdvice注解就会监测到整个项目中的异常,并且也会有@Controller注解的功能.
这是一个处理空指针异常的方法,在捕捉到项目中的空指针异常的时候就会触发此异常处理方法,方法的业务代码是由程序员自主实现的,返回给前端特定字段.在项目中我们会实现统一的数据格式返回.在这里只是使用HashMap构造了三个字段.
访问接口出现空指针的时候返回的状态码是200,响应字段就是我们设置的三个字段.这样就会给前端明确的信息.
我们还要在类里实现一个匹配所有异常的方法
这就是默认的异常处理,当具体的异常匹配不到的时候,会执行此方法.
统一数据返回(强制性统一数据返回),会在返回数据之前进行数据的重写,这是一种保底策略.
统一数据返回格式使用@ControllerAdvice和ResponseBodyAdvice的方式实现.在数据返回给前端之前进行数据的重写,参数里的body就是controller方法里返回的结果(原返回值).
当统一数据格式返回遇到原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.