zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Spring Boot 2.X 自定义错误页面

Spring错误Boot 自定义 页面
2023-09-11 14:22:55 时间

在项目中我们遇到404找不到的错误、或者500服务器错误,都需要配置相应的页面给用户一个友好的提示。

Spring Boot 2.X 为我们提供了下面 3 种方法实现这个功能。

实现 ErrorController 接口

在 Spring Boot 中,我们可以通过实现 ErrorController 接口,重写 handleError 方法,可以将错误重定向到预先放置在 static 目录下定义的静态 html 网页上。

@Controller
public class MyErrorController implements ErrorController {

	private static final String ERROR = "/error";
	private static final String ERROR_400 = "/400";
	private static final String ERROR_500 = "/500";
	
	@GetMapping(ERROR)
	public String handleError(HttpServletRequest request) {
		Enumeration<String> names = request.getAttributeNames();
		System.out.println(Arrays.toString((Collections.list(names).toArray(new String[0]))));
		Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
		if(statusCode >= 400 && statusCode < 500) {
			return ERROR_400;
		} else {
			return ERROR_500;
		}
	}
	
	@Override
	public String getErrorPath() {
		return ERROR;
	}
}

实现 ErrorPageRegistrar 接口

这个接口就有点麻烦了,需要对每种状态码进行配置。虽然可以将所有的状态码,都重定向到同一个页面,然后在 @Controller 中,再对它们做重定向,可还是很麻烦。

@Configuration
public class MyErrorRegistrar implements ErrorPageRegistrar {

	private static final String ERROR_404 = "/400.html";
	private static final String ERROR_500 = "/500.html";
	
	@Override
	public void registerErrorPages(ErrorPageRegistry registry) {
		System.out.println("ErrorPageRegistrar registerErrorPages");
		ErrorPage[] errorPages = new ErrorPage[2];
		errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, ERROR_404);
		errorPages[1] = new ErrorPage(HttpStatus.GATEWAY_TIMEOUT, ERROR_500);
		registry.addErrorPages(errorPages);	
	}
}

配置嵌入式Servlet容器

ConfigurableWebServerFactory 用的也是 ErrorPage,跟之前一样

@Configuration
public class MyServerFactory {

	@Bean
	public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
		return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {

			private static final String ERROR_404 = "/400.html";
			private static final String ERROR_500 = "/500.html";
			
			@Override
			public void customize(ConfigurableWebServerFactory factory) {
				ErrorPage[] errorPages = new ErrorPage[2];
				errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, ERROR_404);
				errorPages[1] = new ErrorPage(HttpStatus.GATEWAY_TIMEOUT, ERROR_500);
				factory.addErrorPages(errorPages);
				factory.setPort(8080);
			}
			
		};
	}
}