SpringBoot统一功能处理

拦截器

拦截器是Spring框架提供的核心功能之⼀,主要用来拦截用户的请求,在指定方法前后,根据业务需要执行预先设定的代码,例如强制登录功能。

拦截器的使用分为定义拦截器和配置拦截器两部分

定义

java 复制代码
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {



    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session =request.getSession();
        log.info("请求前");
        UserInfo userInfo = (UserInfo) session.getAttribute(Constants.USER_SESSION_KEY);
        if(userInfo == null || userInfo.getId()<=0) {
            response.setStatus(401);
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        log.info("请求后");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        log.info("视图渲染后");
    }
}

注册

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(loginInterceptor)
               .addPathPatterns("/**")
               .excludePathPatterns("/user/login")
               .excludePathPatterns("/css/**")
               .excludePathPatterns("/js/**")
               .excludePathPatterns("/pic/**")
               .excludePathPatterns("/**/*.html")
       ;
    }
}

拦截器执行流程

统一数据返回格式

代码

java 复制代码
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    private static ObjectMapper mapper = new 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 String){
            return mapper.writeValueAsString(Result.success(body));
        }
            return Result.success(body);
    }
}

其中对于String类型要进行特殊处理的原因是,Spring对于一般对象和String类型使用的处理器不同,其他对象使用的处理器,会自己转换为json字符串,而String类型会直接写入结构体中,因此需要进行特殊转换。

对于本身为Result类型的对象,直接返回body即可,要不会套两层。因为我代码中不存在,所以我没写。

统一异常处理

代码

java 复制代码
@Slf4j
@ResponseBody
@ControllerAdvice
public class ExceptionAdvice {

    @ExceptionHandler
    public Result handlerException(Exception e){
        log.error("发生异常, e: {}", e);
        return Result.fail("内部错误");
    }

    @ExceptionHandler
    public Result handlerException(NullPointerException e){
        log.error("发生异常, e:", e);
        return Result.fail("发生空指针异常");
    }

    @ExceptionHandler
    public Result handlerException(ArithmeticException e){
        log.error("发生异常, e:", e);
        return Result.fail("发生算术异常");
    }
}
相关推荐
2301_8112743110 小时前
基于SpringBoot的智能家居管理系统
spring boot·后端·智能家居
毕设源码_古学姐10 小时前
计算机毕业设计springboot智能家居项目管理系统 基于SpringBoot的智能家居项目管理平台设计与实现 SpringBoot技术驱动的智能家居项目管理系统开发
spring boot·智能家居·课程设计
毕设源码-张学姐10 小时前
计算机毕业设计springboot智能家居设备信息管理系统 基于SpringBoot的智能家居设备全生命周期管理平台 面向智慧家庭的SpringBoot设备资产与场景运营系统
spring boot·智能家居·课程设计
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
舒一笑10 小时前
我把设备指纹生成逻辑拆开了:它到底凭什么区分不同设备?
后端·程序员·掘金技术征文
try2find10 小时前
打印ascii码报错问题
java·linux·前端
014-code10 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
Nicander10 小时前
多数据源下@transcation事务踩坑
java·后端
郑州光合科技余经理10 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
それども11 小时前
DELETE 和 TRUNCATE TABLE区别
java·数据库·mysql