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 异常");
    }
}
相关推荐
Bs_MoneyMagnet9 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
loser.with.m11 小时前
【AgentScope 2.0】05-从数据库配置到可运行 Agent:十个 Builder 开关怎么把一行 JSON 变成 HarnessAgent
人工智能·spring boot·ai
行百里er12 小时前
Spring Insight 里收到的 Span 是怎么存下来的
spring boot·spring·监控
xcl092514 小时前
智慧健身场馆系统开发实战:从架构设计到核心模块落地指南
java·spring boot
vx-程序开发14 小时前
【计算机毕设】基于Spring Boot的古城景区管理系统88564
java·数据库·spring boot·后端·spring·elasticsearch·课程设计
vx-Biye_Design15 小时前
springboot中国传统节日宣传平台49078-计算机课程设计、毕业设计
java·前端·vue.js·spring boot·后端·课程设计·idea
代码调试师17 小时前
【毕设分享】springboot攀枝花生鲜电商平台58990
java·vue.js·spring boot·后端·架构·eclipse·课程设计
xcl092517 小时前
全民健身解决方案小程序系统开发实战:从架构设计到上线指南
java·spring boot
洛阳泰山17 小时前
别卷 Python 了:我用 Java 21 + Spring Boot 3 打造了一个企业级 RAG + 智能体工作流引擎(附架构与源码解析)
java·spring boot·后端
树若逝花若殇18 小时前
基于Spring AOP优雅记录请求响应日志
java·spring boot