当前位置: 首页 > news >正文

【SpringBoot】SpringBoot 纯后端项目如何自定义异常页面(Whitelabel Error Page)

文章目录

  • 背景
  • 安排
    • 方案
    • 步骤
  • 验证

背景

  • 一个短链服务,业务将长链接给我,我转换成短地址,用户访问短地址时,我再做redirect;
  • 没有前端,纯后端项目
  • 短链会有过期时间,过期后将返回错误信息
  • 某一天一个宁静的下午,业务反馈,你这错误码,直接给用户看,不友好,麻烦弄一个404页面吧。

当前代码如下:当查询不到对应链接(过期、或者不存在)时,返回JSON格式的统一响应:

灵机一动,不需要JSON是吧,我直接返回404不就行了吗?于是稍作改动:

此时再访问,会跳转到默认的error页面,看起来是比一个JSON串友好,但是,这东西,除了咱们这些计算机科学家,大部分人也看不懂,还是不友好!!!

安排

方案

有三种方法可以解决眼下的问题:

  • 方法一:在配置文件中设置server.error.whitelabel.enabledfalse,然后在controller中定义/error请求,返回自定义的内容。
  • 方法二:在项目中创建一个名为error的视图(如HTML或JSP文件),放在模板目录下(如src/main/resources/templates),然后SpringBoot会自动将错误请求转发到该视图。
  • 方法三:实现ErrorPageRegistrar接口,注册不同的错误页面,针对不同的HTTP状态码。
  • 方法四:搭一个nginx,作为404页面的静态资源服务器。

用户需求是返回一个好看的404页面,方法一排除;

项目是纯后端项目,方法二排除;

为一个页面搭一个nginx,不值当,方法四排除;

所以,选定方法三。

步骤

方法三的详细说明如下:

  • 首先,你需要创建一个配置类,实现ErrorPageRegistrar接口,这个接口有一个方法registerErrorPages,用于注册不同的错误页面。
  • 然后,你需要在registerErrorPages方法中创建一个ErrorPage数组,每个ErrorPage对象包含一个HttpStatus和一个路径,表示当发生该状态码的错误时,跳转到哪个路径。
  • 最后,你需要调用registry.addErrorPages(errorPages)方法,将错误页面数组注册到错误页面注册器中。

下面是一个示例代码:

@Configuration
public class ErrorCodePageHandler implements ErrorPageRegistrar {@Overridepublic void registerErrorPages(ErrorPageRegistry registry) {ErrorPage[] errorPages = new ErrorPage[2];// 添加错误页面进行映射errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");errorPages[1] = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");registry.addErrorPages(errorPages);}
}

html文件需要放在静态资源目录下(如src/main/resources/static),然后在该文件夹中创建一个名为404.html的文件,写上你想要显示的内容。

这样,当发生404错误时,SpringBoot会自动将请求转发到/404.html路径,显示你自定义的错误页面。

一个最简单的404.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>404 Not Found</title>
</head>
<body><h1>Oops!</h1><p>The page you are looking for does not exist.</p>
</body>
</html>

验证

项目结构:

页面效果:

当然,这个页面不是最终效果,会有专业的小姐姐提供优美的页面。

http://www.lryc.cn/news/69898.html

相关文章:

  • Netty核心技术三--NIO编程
  • 机器人的运动范围:DFS
  • Rshiny编写ui中具有web依赖项的控件{该问题的具体阐述请看引言}
  • 1700页,卷S人的 软件测试《八股文》PDF手册,涨薪跳槽拿高薪就靠它了
  • bundle的常用命令
  • 一、数据字典介绍
  • 常见的SQL优化
  • Sonic新生态Sonic IDE体验
  • [VRTK4.0]安装VRTKv4Tilia软件包导入程序
  • SpringBoot开发实用篇2---与数据层技术有关的替换和整合
  • 科普ChatGPT
  • Spring MVC的核心类和注解
  • Java 创建一个大文件
  • 董小姐大意了
  • Java高并发核心编程—内置锁原理篇
  • opencv文字识别
  • bool、python集合
  • 从零开始学架构——可扩展架构模式
  • Day03 01-MySQL数据完整性详解
  • DJ 5-4 以太网 Ethernet
  • 华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】
  • Java 实现 二叉树的 后序遍历
  • rk3588安装qt虚拟键盘
  • HCIP-RIP双向重发布综合实验
  • Flask的使用例子
  • 【基础6】存储过程的 创建与调用
  • 如何快速实现接口自动化测试,常规接口断言封装实践
  • java+nodejs+vue+python+php家教信息管理系统
  • 课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)
  • 【数据结构】线性表之栈、队列