文章目录
- 背景
- 安排
- 方案
- 步骤
- 验证
背景
- 一个短链服务,业务将长链接给我,我转换成短地址,用户访问短地址时,我再做redirect;
- 没有前端,纯后端项目
- 短链会有过期时间,过期后将返回错误信息
- 某一天一个宁静的下午,业务反馈,你这错误码,直接给用户看,不友好,麻烦弄一个404页面吧。
当前代码如下:当查询不到对应链接(过期、或者不存在)时,返回JSON格式的统一响应:
灵机一动,不需要JSON是吧,我直接返回404不就行了吗?于是稍作改动:
此时再访问,会跳转到默认的error页面,看起来是比一个JSON串友好,但是,这东西,除了咱们这些计算机科学家,大部分人也看不懂,还是不友好!!!
安排
方案
有三种方法可以解决眼下的问题:
- 方法一:在配置文件中设置
server.error.whitelabel.enabled
为false
,然后在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 {
@Override
public 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>
验证
项目结构:
页面效果:
当然,这个页面不是最终效果,会有专业的小姐姐提供优美的页面。