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

举报
福州司马懿 发表于 2021/11/19 01:38:34 2021/11/19
【摘要】 在项目中我们遇到404找不到的错误、或者500服务器错误,都需要配置相应的页面给用户一个友好的提示。 Spring Boot 2.X 为我们提供了下面 3 种方法实现这个功能。 实现 ErrorCon...

在项目中我们遇到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;
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

实现 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);	
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

配置嵌入式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);
			}
			
		};
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/100034803

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。