默认ref="/tag/152/" style="color:#2B406D;font-weight:bold;">错误处理行为
SpringBoot内置了一套自动化的错误处理机制。当应用发生异常时,比如访问一个不存在的接口或服务器内部出错,它会自动返回一个JSON格式的错误信息页面(在非浏览器请求中)或 whitelabel error page(浏览器直连时)。这种默认行为由ErrorMvcAutoConfiguration配置类驱动,适用于大多数基础场景。
自定义全局异常处理器
在实际项目中,直接暴露堆栈信息存在安全风险。可以通过 @ControllerAdvice 配合 @ExceptionHandler 实现统一拦截。例如,捕获所有 Controller 层抛出的 RuntimeException,并返回结构化响应:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<Map<String, Object>> handleRuntimeException() {
Map<String, Object> body = new HashMap<>();
body.put("timestamp", System.currentTimeMillis());
body.put("message", "系统繁忙,请稍后再试");
body.put("status", 500);
return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
区分不同异常类型
可以针对 NullPointerException、IllegalArgumentException 等具体异常编写独立处理方法。这样前端能根据返回的状态码和 message 字段判断问题来源,而不是收到千篇一律的“服务器错误”。
替换默认错误页面
若希望关闭白标签页面并返回纯 JSON 数据,可在 application.yml 中设置:
server:
error:
whitelabel:
enabled: false
同时实现 ErrorController 接口来自定义/error路径的行为,或者更推荐的方式是使用 Spring Boot 提供的 ErrorAttributes 进行数据定制。
结合日志记录提升排查效率
虽然对外要隐藏详细错误,但在服务端必须完整记录。可以在异常处理器中加入日志输出:
logger.error("请求异常:{}", ex.getMessage(), ex);
配合 ELK 或其他集中式日志系统,运维人员可快速定位攻击尝试、代码缺陷或非法输入,这对防范恶意探测尤为重要。
避免敏感信息泄露
某些框架异常可能携带类名、方法名甚至参数值。若不加过滤地返回给客户端,相当于把内部结构送给攻击者。建议在全局处理器中清洗数据,只保留必要字段。例如,禁用 stacktrace 的对外展示:
server:
error:
include-stacktrace: never
使用ResponseStatus注解声明式处理
对于业务层面已知的异常,如用户未登录、权限不足等,可以直接通过 @ResponseStatus 注解标记异常类:
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "权限不足")
public class AccessDeniedException extends RuntimeException {
}
这样在抛出该异常时,Spring会自动设置对应的状态码和响应体提示,减少重复代码的同时也降低了误配风险。