分类
spring-boot

Spring Boot: 自定义 Whitelabel 错误页面

Spring Boot: Customize Whitelabel Error Page

本文资源:

在正式开始前,可以点击以下链接获取一份与本文相同的初始化代码。

1. 概述

本文将介绍如何禁用以及自定义Spring Boot的默认错误页面。

2. 禁用错误页

可以简单的通过设置以下配置项来达到禁用错误页的目的:

server.error.whitelabel.enabled=false

此时若发生错误则将显示其servlet的错误信息,比如将显示Tomcat的错误页面。

除上述方法外,还可以通过排除ErrorMvcAutoConfiguration bean的方法来达到同样的效果:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration

除上述两种方法外,也可以在系统启动类上加入以下注解:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

3. 显示自定义错误页面

在开始自定义错误页面以前,首先确认当前项目加入了Thymeleaf 模拟引擎。在此基础上,新建如下 error.html 模板:

<!DOCTYPE html>
<html>
<body>
<h1>Something went wrong! </h1>
<h2>Our Engineers are on it</h2>
<a href="/">Go Home</a>
</body>
</html>

注意:Thymeleaf 默认的模板位于 resources/templates 目录。该目录下的 error.html 模板将会自动被 Spring Boot 中的BasicErrorController 识别并应用。此时一旦发生错误,Spring Boot将会渲染 error.html 并显示在浏览器上。

除此以外Spring Boot还支持按错语的状态码来自定义错误信息,比如我们想定义发生404错语的信息,则可以在resources/templates/error 中新建404.html文件。

此时,若发生404错误,Spring Boot将渲染404.html.

3.1 自定义错误控制器

仅仅通过自定义错误模板的方法还远远不错。比如:我们想在错误发生时显示更多、更人性的信息;记录发生错误时用户请求信息;在404页面中进行热门商品的推送等。

这时候就需要一个自定义错语控制器:

@Controller
public class CustomErrorController implements ErrorController {

    @RequestMapping("/error")
    public String handleError() {
        System.out.println("hello");
        // 进行一些逻辑处理,比如记错报错时的请求地址、请求参数、登录用户等
        return "error";
    }

    @Override
    public String getErrorPath() {
        return null;
    }
}

如上所示,使用实现ErrorController接口的方法来标识此类为 自定义错误控制器。当发生错误时handleError()将被触发,返回值对应 Thymeleaf 的相应模板,此时可以通过修改error.html以达到自定义提示信息的目的。不仅如此,我们还可以在C层中进行一些逻辑处理,或将一些希望显示在错误错误的信息由C层组装并在模板中渲染。

以下我们演示一下如果简单地对handleError() 进行升级,以使其能够在发生不同的错误时显示不同的错误信息。

@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
    
    if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());
    
        if(statusCode == HttpStatus.NOT_FOUND.value()) {
            // 发生404错误时,渲染error-404模板
            return "error-404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            // 发生500错误时,渲染error-500模板
            return "error-500";
        }
    }
    // 未获取到错误类型时,渲染error模板
    return "error";
}

此时当发生404错语时,将为用户展示error-404.html模板;当发生500错误,将为用户展示error-500.html模板。

4. 总结

本文展示了几种自定制错误页面的方法,在此方法的基础上当系统发生相应的错误时,可以展示更加友好的提示信息。