SpringBoot统一功能处理

目录

拦截器

拦截器是Spring框架提供的核心功能之一,主要用来拦截用户的请求,通常用于处理在请求到达最终目的地之前或响应返回给客户端之前的预处理和后处理任务。

拦截器的使用分为两步:1、定义拦截器,2、注册拦截器

1、定义拦截器

需要实现HandlerInterceptor接口,重写preHandle等方法

例如:

java 复制代码
@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(......){
            return false;
        }
        return true;//true 放行, false 拦截
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

2、注册拦截器

需要实现WebMvcConfigurer接口,重写addInterceptors方法,通过registry.addInterceptor进行注册

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
            .addPathPatterns("/test/**")//生效的路径,对test下所有的路径生效
            .excludePathPatterns("/user/login");//要排除的路径(不拦截该路径)
    }
}

拦截路径设置:

拦截路径 含义 举例
/* 一级路径 能匹配/user、/book、/login,不能匹配user/login
/** 任意级路径 能匹配/user、/user/login、/uesr/reg
/book/* /book下的一级路径 能匹配/book/addBook,不能匹配/book/addBook/aaa、/book
/book/** /book下的任意路径 能匹配/book、/book/addBook、/book/addBook/aaa、不能匹 配/user/login

统一数据返回格式

实现ResponseBodyAdvice接口,重写supports、beforeBodyWrite方法,并且需要加上@ControllerAdvice注解

java 复制代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;//是否支持对返回结果进行统一处理,true表示支持
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //如何重写
        return null;
    }
}

例如:

对返回结果封装成Result类

java 复制代码
@Data
public class Result<T> {
    private int code; //200-成功  -1 用户未登录  -2 程序出错   业务状态码, 非http状态码
    private String errMsg;
    private T data;

    public static <T> Result success(T data) {
        Result result = new Result();
        result.setCode(200);
        result.setErrMsg("");
        result.setData(data);
        return result;
    }

    public static <T> Result unlogin() {
        Result result = new Result();
        result.setCode(-1);
        result.setErrMsg("用户未登录");
        return result;
    }

    public static <T> Result fail(T data) {
        Result result = new Result();
        result.setCode(-2);
        result.setErrMsg("程序发生错误!");
        return result;
    }
}

统一数据返回格式:

java 复制代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows//自动抛出检查型异常
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        if (body instanceof Result<?>) {
            return body;
        }

        if (body instanceof String) {
            //将字符串转json
            return objectMapper.writeValueAsString(Result.success(body));
        }

        return Result.success(body);
    }
}

统一异常处理

需要加上@ControllerAdvice注解,处理异常的方法加上@ExceptionHandler注解

java 复制代码
@ControllerAdvice
public class ExceptionAdvice {
    @ExceptionHandler
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//设置HTTP状态码
    public Object handler(Exception e) {
        log.error("发生异常,e", e);
        return Result.fail();
    }
}

可以存在多个方法,处理多个异常

例如:

java 复制代码
@Slf4j
@ControllerAdvice
@ResponseBody//返回数据,Result.fail()是数据
public class ExceptionAdvice {
    @ExceptionHandler
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Object handler(Exception e) {
        log.error("发生异常,e", e);
        return Result.fail();
    }

    @ExceptionHandler
    public Object handler(ArrayIndexOutOfBoundsException e){
        log.error("发生异常, e:{} ", e.getMessage());
        return Result.fail("发生数组越界异常");
    }
    @ExceptionHandler
    public Object handler(NullPointerException e){
        log.error("发生异常, e: ", e);
        return Result.fail("发生NullPointerException 异常");
    }

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler
    public Object handler(NoResourceFoundException e){
        log.error("发生异常, e: {}, path:{}", e.getDetailMessageCode(), e.getResourcePath());
        return Result.fail("发生NoResourceFoundException 异常");
    }
}
相关推荐
栗豆包26 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
m0_748239473 小时前
springBoot发布https服务及调用
spring boot·后端·https
计算机-秋大田3 小时前
基于SpringBoot的高校教师科研的设计与实现(源码+SQL脚本+LW+部署讲解等)
java·vue.js·spring boot·后端·课程设计
web150850966413 小时前
Spring Boot整合WebSocket
spring boot·后端·websocket
m0_748238275 小时前
SpringBoot最佳实践之 - 使用AOP记录操作日志
java·spring boot·后端
Q_27437851095 小时前
springboot基于微信小程序的健康管理系统
spring boot·后端·微信小程序
兩尛6 小时前
缓存商品、购物车(day07)
java·spring boot·缓存
m0_748245526 小时前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
工业互联网专业7 小时前
基于springboot+vue的高校社团管理系统的设计与实现
java·vue.js·spring boot·毕业设计·源码·课程设计
m0_748234527 小时前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring