Spring Security Note-3
服务异常处理
Spring Boot 中默认的错误处理机制
例如:
访问不存在的URL时,返回一个空白的错误页(状态码404);
当浏览器访问时,返回的是一个HTML页面;(Accept: text/html)
当客户端(Restlet Client模拟)访问时,返回的是一个JSON;(Accept: */*)
这是Spring Boot默认的错误返回机制;
public class BasicErrorController extends AbstractErrorController {…}
根据请求头(header)中的信息不同,进行不同的处理;
1 | "text/html"}) (produces = { |
1 |
|
在默认的错误返回机制下,已经可以解决大部分的错误和异常;
自定义异常处理
我们在main/resources文件夹目录下,新建一个目录结构 main/resources/resources/error
在error文件夹目录下,新建一个404.html的页面;
此时,浏览器再次访问http://127.0.0.1:8080/xxx页面,404错误时,不再是返回空白的错误页面;
而是返回自定义的404.html页面的内容;
对于客户端的错误信息如何自定义?
1 | "/{id:\\d+}") ( |
通过自定义异常类(extends RuntimeException)
1 | public class UserNotExistException extends RuntimeException { |
并且在Controller中,定义一个新的类ControllerExceptionHandler,用于处理其他Controller所抛出的所有异常信息;
1 |
|
SpringBoot默认异常返回机制
1 | { |
自定义异常返回机制
1 | { |
使用Filter和Interceptor拦截REST服务
需求:记录所有服务的处理时间
过滤器 Filter
无法获得具体调用的参数,具体的Controller,具体的方法;
1 |
|
Q:若第三方过滤器的框架,无法进行Spring @Component的注解怎么办?
A:在传统的项目中,有一个web.xml的配置文件,将第三方的过滤器,配置到web.xml文件即可;
A:但是Spring项目不存在web.xml文件,如何配置进去?通过自定义WebConfig的方式;
1 |
|
拦截器 Interceptor
1 |
|
1 |
|
使用切片拦截REST服务
切片(AOP) Aspect
1 |
|
过滤器:可以拿到原始的HTTP请求和相应的信息,但是拿不到处理请求信息方法的信息;
拦截器:即可以拿到原始的HTTP请求和相应的信息,也能拿到处理请求的方法的信息,但是拿不到被调用的参数的值;
切片:可以拿到处理请求的方法的信息,以及真正调用方法的参数的值,但是拿不到原始的HTTp请求和相应的对象;
三个对象各有各特点,根据具体的业务需要,选择具体的拦截机制;
拦截机制的拦截顺序:Filter -> Interceptor -> ControllerAdvice -> Aspect -> Controller
使用REST方式处理文件服务
上传
1 | // 模拟上传到本地 |
1 |
|
下载
1 | // 通过API下载 |