SpringBoot多种自定义错误页面方式小结
作者:IT_faquir 发布时间:2021-12-12 00:56:03
在项目中为了友好化,对于错误页面,我们常常会使用自定义的页面。SSM框架组合时代,我们通常通过拦截或者在web.xml中设置对于错误码的错误页面,然而到了SpringBoot,web.xml消失了,SpringBootServletInitializer初始化servlet代替了web.xml。难道要再把web.xml加回去?这样虽然可以做到,但并不合理。
下面提供了多种在SpringBoot中实现自定义错误页面的方法。
以前web.xml方式
先来看下在web.xml中配置错误页面的方式:
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
SpringBoot中实现方式
在SpringBoot后,可以通过如下几种方式实现自定义错误页面。
1.实现EmbeddedServletContainerCustomizer的bean
适合内嵌服务器,先在controller中定义我们的错误页面Mapping,通过在配置类中实现EmbeddedServletContainerCustomizer的bean,加入对应状态码的错误页面。注意这种方式在打成war后,供外部tomcat使用时,将会失效。
定义错误页面:
@RequestMapping(value = "/error/[code]")
public String error(@PathVariable int code, Model model) {
String pager = "/content/error-pager";
switch (code) {
case 404:
model.addAttribute("code", 404);
pager = "/content/error-pager";
break;
case 500:
model.addAttribute("code", 500);
pager = "/content/error-pager";
break;
}
return pager;
}
在配置类中加入EmbeddedServletContainerCustomizer:
/**
* 配置默认错误页面(仅用于内嵌tomcat启动时)
* 使用这种方式,在打包为war后不起作用
*
* @return
*/
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return container -> {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
container.addErrorPages(error404Page, error500Page);
};
2.通过 * 方式
适合内嵌Tomcat或者war方式。
/**
* @author hgs
* @version ErrorPageInterceptor.java, v 0.1 2018/03/04 20:52 hgs Exp $
* <p>
* 错误页面 *
* 替代EmbeddedServletContainerCustomizer在war中不起作用的方法
*/
@Component
public class ErrorPageInterceptor extends HandlerInterceptorAdapter {
private List<Integer> errorCodeList = Arrays.asList(404, 403, 500, 501);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
Exception {
if (errorCodeList.contains(response.getStatus())) {
response.sendRedirect("/error/" + response.getStatus());
return false;
}
return super.preHandle(request, response, handler);
}
}
在配置类中添加拦截
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(errorPageInterceptor);//.addPathPatterns("/action/**", "/mine/**");默认所有
super.addInterceptors(registry);
}
}
3.自定义静态error页面方法
在resource/templates下添加error.html页面,springBoot会自动找到该页面作为错误页面,适合内嵌Tomcat或者war方式。
SpringBoot错误视图提供了以下错误属性:
timestamp
:错误发生时间;status
:HTTP状态吗;error
:错误原因;exception
:异常的类名;message
:异常消息(如果这个错误是由异常引起的);errors
:BindingResult异常里的各种错误(如果这个错误是由异常引起的);trace
:异常跟踪信息(如果这个错误是由异常引起的);path
:错误发生时请求的URL路径。
SpringBoot使用的前端框架模板不同,页面的名称也有所不同:
实现Spring的View接口的Bean,其ID需要设置为error(由Spring的BeanNameViewResolver所解析);
如果配置了Thymeleaf,则需命名为error.html的Thymeleaf模板;
如果配置了FreeMarker,则需命名为error.ftl的FreeMarker模板;
如果配置了Velocity,则需命名为error.vm的Velocity模板;
如果是用JSP视图,则需命名为error.jsp的JSP模板。
Thymeleaf实例:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}"></title>
</head>
<body class="layout">
<div class="wrap">
<!-- S top -->
<div th:include="/header/module-header::module-header"></div>
<!-- S 内容 -->
<div class="panel-l container clearfix">
<div class="error">
<p class="title"><span class="code" th:text="${status}"></span>非常抱歉,没有找到您要查看的页面</p>
<a href="/" rel="external nofollow" class="btn-back common-button">返回首页
<img class="logo-back" src="/img/back.png">
</a>
<div class="common-hint-word">
<div th:text="${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}"></div>
<div th:text="${messages}"></div>
<div th:text="${error}"></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
对于外部Tomcat第三中方案是比较推荐的一种实现方式,但不够灵活,我们不好定义自己的属性,如果想对其做相应修改,可以参见源码BasicErrorController,通过继承AbstractErrorController,并重写errorHtml方法,达到自己想要的效果。在内嵌Tomcat时,第一种推荐使用,更具灵活性。
来源:https://blog.csdn.net/IT_faquir/article/details/79521417


猜你喜欢
- 前言Android 很多场合需要使用到数据加密,比如:本地登录密码加密,网络传输数据加密,等。在android 中一般的加密方式有如下:亦或
- SpringMVC RESTFul访问首页实现一、新建 index.html在 webapp\WEB-INF\templates 下新建首页
- maven3 安装:安装 Maven 之前要求先确定你的 JDK 已经安装配置完成。Maven是 Apache 下的一个项目,目前最新版本是
- 在Android中,用string-array是一种简单的提取XML资源文件数据的方法。例子如下:把相应的数据放到values文件夹的arr
- LinkedList简介LinkedList是一个使用双向链表结构实现的容器,与ArrayList一样,它能动态扩充其长度,LinkedLi
- 现在看我文章的多数是一些老Android了,相信每个人使用起LayoutInflater都是家常便饭,信手拈来。但即使是这样,我仍然觉得这个
- 本文详细的介绍了Spring组件的实现步骤,分享给大家,具体如下:背景Spring 框架提供了许多接口,可以使用这些接口来定制化 bean
- 本文实例为大家分享了Java实现多线程在线聊天的具体代码,供大家参考,具体内容如下上一篇博客通过UDP实现了聊天,但只能单方面发送消息,这次
- 什么是 MyBatis ?MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有
- 在 C语言中,占位符是一种用于格式化输出的特殊字符,通常用于 printf() 等输出函数中,用于指定输出的格式和内容。在本文中,我们将详细
- 安卓中为activity创建菜单,供大家参考,具体内容如下1.在res上面右键 > new > Android xml file
- 1. JAVA 内存模型 (JMM)JMM是用来干嘛的?:《Java虚拟机规范》中曾试图定义一种“Java内存模型&am
- Unity脚本自动添加头部注释就是创建.cs文件时自动添加作者名,创建时间,文件名等看示例,我们在Unity的project面板下先创建一个
- 本文实例为大家分享了Android实现指针刻度转盘的具体代码,供大家参考,具体内容如下一. 先上个效果图,实现如图所示刻度转盘和2个文本的绘
- PS:本文使用jdk1.7解析1.Object类 的equals 方法 /** &
- 虹软免费,高级版本试用支持在线、离线有 Java SDK,C++ SDK一、注册虹软开发者平台点击注册注册完成后可在“我
- 在市面上很多的APP都使用了对图片作模糊化处理后作为背景的效果,来使得整个页面更具有整体感。如下就是网易云音乐的音乐播放页面:很明显这个页面
- 一、概述1、事务ACID特性事务将一系列的工作视为一个工作单元,它具有 ACID 特性:A:Atomicity 不可分性 也就是说
- 本文实例讲述了Java实现的计算最大下标距离算法。分享给大家供大家参考,具体如下:题目描述给定一个整形数组,找出最大下标距离j−i, 当且A
- 一、电量统计模块概述耗电信息在设置 -> 电量中能够非常直观的看到。注意,Android 所有功耗统计都是通过代码估算,没有集成电路参