spring boot 管理系统中,html 页面全局异常提示由后端统一接管 /error 路径,根据 accept 头自动返回 error.html(浏览器)或 json(ajax);error.html 必须置于 templates/ 目录下且命名固定,支持 ${status} 等变量动态渲染,404/500 等可单独建 templates/error/404.html 精准匹配,ajax 异常需通过 @restcontrolleradvice 处理。

Spring Boot 管理系统里,HTML 页面的全局异常提示页面不是靠前端 JS 单独“布局”出来的,而是由后端统一接管 /error 路径、按请求类型(Accept: text/html 还是 application/json)决定返回 HTML 还是 JSON。所谓“布局”,本质是配置好模板位置、状态码映射和数据透出方式。
error.html 必须放在 templates 目录下且命名固定
Thymeleaf 模板引擎下,Spring Boot 只认 src/main/resources/templates/error.html 这个路径和文件名。它不是“可选页面”,而是触发机制的入口点——只要这个文件存在,所有未被捕获的 4xx/5xx 异常(浏览器访问时)都会被 BasicErrorController 自动转发至此。
- 放错位置(比如丢进
static或自建errors子目录)会导致完全不生效,继续显示 Whitelabel Error Page - 文件名写成
error-page.html或404.html(没配静态资源映射)也无效,除非你额外配置了状态码专用页 - 如果用 FreeMarker 或 Velocity,对应路径和命名规则不同,但逻辑一致:模板引擎有约定俗成的查找路径
HTML 模板里要显式取 status、error、message 等模型属性
BasicErrorController 默认会把异常信息封装进 Model,传给 error.html。不手动读这些变量,页面就只能显示静态文案,起不到“提示异常原因”的作用。
- Thymeleaf 中必须用
th:text="${status}"、th:text="${error}"、th:text="${message}"才能动态渲染 HTTP 状态码、错误类型和消息 -
${timestamp}和${path}也可取,但注意它们是字符串格式,不是 Date 对象,直接输出即可 - 别依赖
${exception}——它默认不暴露,开启需配置server.error.include-exception=true(生产环境不建议)
404/500 等状态码需要单独建文件才能精准匹配
只靠 error.html 是兜底行为。真要区分 404 页面找不到 vs 500 后端崩了,得在 templates/error/ 下建对应文件:
-
templates/error/404.html→ 专门处理 404 -
templates/error/500.html→ 专门处理 500 - 文件名必须是纯数字 +
.html,不能带空格或下划线 - 这些子页面同样能用
${status}等变量,且优先级高于根目录的error.html
AJAX 请求异常不会走 error.html,得靠 @RestControllerAdvice
管理系统的按钮点击、表单提交很多是 AJAX,此时请求头带 Accept: application/json,BasicErrorController 会返回 JSON 而非 HTML。这时候 error.html 完全不参与流程。
- 必须另写
@RestControllerAdvice类,用@ExceptionHandler捕获异常并返回Result结构体 - 前端 JS 需统一拦截响应状态码(如
response.status === 500)或业务 code 字段,再调用 toast 或 modal 显示提示 - 别指望一个 HTML 页面同时服务 SSR 和 AJAX 场景——这是两种响应通道,得分开处理
真正容易被忽略的是:error.html 的渲染上下文和普通 Controller 返回的页面不一样,它没有经过你的自定义 Interceptor,也不走 @ModelAttribute 预填充逻辑。所有数据都来自 BasicErrorController 的硬编码注入,想加自定义字段(比如当前登录用户名)就得重写 BasicErrorController 或改用 @ControllerAdvice 全局接管。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











