资讯动态

SpringBoot统一功能处理

发布时间:2026/8/12 15:17:59 来源:尧图企业网站定制
文章目录1. 拦截器1.1 拦截路径1.2 拦截器执行流程1.3 自定义拦截器1.4 注册配置拦截器2. 统一数据返回格式3. 统一异常处理4. 总结1. 拦截器拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码在拦截器当中开发人员可以在应用程序中做一些通用性的操作, 比如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录用户的信息. 如果有就可以放行, 如果没有就进行拦截.拦截器的使用分两步:自定义拦截器: 实现HandlerInterceptor接口并重写其所有方法注册配置拦截器: 实现WebMvcConfigurer接口并重写addInterceptors方法先简单介绍实现HandInterceptor接口要重写的方法:preHandle() :目标方法执行前执行, 返回true, 继续执行后续操作; 返回false, 中断后续操作.postHandle() : 目标方法执行后执行afterCompletion(): 视图渲染完毕后执行最后执行(后端开发现在几乎不涉及视图, 暂不了解)1.1 拦截路径拦截路径是指我们定义的这个拦截器, 对哪些请求生效,我们在注册配置拦截器的时候, 通过 addPathPatterns() 方法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求, 具体使用会在后文介绍常见拦截路径配置/* :一级路径/** :任意级路径/book/* :/book下的一级路径/book/** :/book下的任意级路径1.2 拦截器执行流程添加拦截器后, 执行Controller的方法之前, 请求会先被拦截器拦截住. 执行preHandle()方法这个方法需要返回一个布尔类型的值.如果返回true, 就表示放行本次操作, 继续访问controller中的方法.如果返回false则不会放行(controller中的方法也不会执行).controller当中的方法执行完毕后再回过来执行postHandle()这个方法以及afterCompletion()方法执行完毕之后最终给浏览器响应数据1.3 自定义拦截器ComponentSlf4jpublicclassLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{HttpSessionsessionrequest.getSession(false);if(session!nullsession.getAttribute(Constants.SESSION_USER_KEY)!null){returntrue;}response.setStatus(401);returnfalse;}}注意要加上Component交给Spring管理http状态码401: Unauthorized未经过认证. 指示身份验证是必需的, 没有提供身份验证或身份验证失败. 如果请求已经包含授权凭据那么401状态码表示不接受这些凭据1.4 注册配置拦截器ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{AutowiredprivateLoginInterceptorloginInterceptor;//排除前端静态资源privateListStringexcludePathsArrays.asList(/user/login,/**/*.js,/**/*.css,/**/*.png,/**/*.html);OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){// 注册自定义拦截器对象registry.addInterceptor(loginInterceptor).addPathPatterns(/**)//设置拦截器拦截的请求路径(/**表示拦截所有请求).excludePathPatterns(excludePaths);//设置拦截器排除拦截的路径}}.excludePathPatterns的参数可以是Sting, 可也意识ListString2. 统一数据返回格式统一的数据返回格式使用 ControllerAdvice 和ResponseBodyAdvice 的方式实现:ControllerAdvice表示控制器通知类实现ResponseBodyAdvice 接口, 并在类上添加ControllerAdvice 注解supports方法: 判断是否要执行beforeBodyWrite方法. true为执行, false不执行. 通过该方法可以选择哪些类或哪些方法的response要进行处理, 其他的不进行处理beforeBodyWrite方法: 对response方法进行具体操作处理ControllerAdvicepublicclassResponseAdviceimplementsResponseBodyAdvice{Overridepublicbooleansupports(MethodParameterreturnType,ClassconverterType){returnfalse;}OverridepublicObjectbeforeBodyWrite(Objectbody,MethodParameterreturnType,MediaTypeselectedContentType,ClassselectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse){returnResult.success(body);}}大多数项目确实不再单纯依赖它来做统一的返回类型封装, 而是结合泛型封装作为主力ResponseBodyAdvice 作为辅助,Controller 返回类型基本都是我们自定义的ResultT, ResponseBodyAdvice 角色 只做有条件的增强加密、脱敏、加头不做统一格式包装如果用ResponseBodyAdvice返回结果为String类型, 还要使用SpringBoot内置提供的Jackson来实现信息的序列化ControllerAdvicepublicclassResponseAdviceimplementsResponseBodyAdvice{privatestaticObjectMappermappernewObjectMapper();Overridepublicbooleansupports(MethodParameterreturnType,ClassconverterType){returntrue;}SneakyThrowsOverridepublicObjectbeforeBodyWrite(Objectbody,MethodParameterreturnType,MediaTypeselectedContentType,ClassselectedConverterType,ServerHttpRequestrequest,ServerHttpResponseresponse){// 如果返回结果为String类型, 使用SpringBoot内置提供的Jackson来实现信息的序列化if(bodyinstanceofString){returnmapper.writeValueAsString(Result.success(body));}returnResult.success(body);}}3. 统一异常处理统一异常处理使用的是 ControllerAdvice ExceptionHandler 来实现的ControllerAdvice表示控制器通知类 ;ExceptionHandler是异常处理器 ;两个结合表示当出现异常的时候执行某个通知也就是执行某个方法事件类名, 方法名和返回值可以自定义, 重要的是注解接口返回为数据时, 需要加 ResponseBody 注解还可以针对不同的异常, 返回不同的结果ResponseBodyControllerAdvicepublicclassErrorAdvice{ExceptionHandlerpublicObjecthandler(Exceptione){returnResult.fail(e.getMessage());}ExceptionHandlerpublicObjecthandler(NullPointerExceptione){returnResult.fail(发生NullPointerException: e.getMessage());}ExceptionHandlerpublicObjecthandler(ArithmeticExceptione){returnResult.fail(发生ArithmeticException: e.getMessage());}}当有多个异常通知时匹配顺序为当前类及其子类向上依次匹配4. 总结拦截器的实现主要分两部分: 1. 定义拦截器(实现HandlerInterceptor 接口) 2. 配置拦截器(实现WebMvcConfigurer接口)统一数据返回格式通过ControllerAdvice ResponseBodyAdvice 来实现统一异常处理使用ControllerAdvice ExceptionHandler 来实现

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价