【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 {

    @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>

验证

项目结构:

页面效果:

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

遇到的问题

浏览器:找不到与以下网址对应的网页:HTTP ERROR 404

服务端:

No mapping for GET /404.html

No handler found for GET /404.html

Resolved [org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /404.html]

解决:

将配置文件中spring.resources.add-mappings去掉或改为true

spring:
  resources:
    add-mappings: false

注意:

如果有Controller中的mapping正好将/404.html匹配了,跳转时会直接走匹配的Controller方法,比如我的uri之前是/{code},没加任何限制,就出现了response 404之后,又走了一次Controller。改成下面的好了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值