SpringBoot多种自定义错误页面方式小结
在项目中为了友好化,对于错误页面,我们常常会使用自定义的页面。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
相关文章
解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
这篇文章主要介绍了解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-28- 这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
- 这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-16
- 这篇文章主要介绍了SpringBoot集成Redis实现消息队列的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-10
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
- 自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
- 这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
- 这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
Spring Boot项目@RestController使用重定向redirect方式
这篇文章主要介绍了Spring Boot项目@RestController使用重定向redirect方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-02- 这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
- 今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
- 这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证...2015-11-24- 这篇文章主要介绍了jquery自定义插件开发之window的实现过程的相关资料,需要的朋友可以参考下...2016-05-09
详解SpringBoot之访问静态资源(webapp...)
这篇文章主要介绍了详解SpringBoot之访问静态资源(webapp...),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-14- 这篇文章主要介绍了SpringBoot接口接收json参数解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-19
springboot中使用@Transactional注解事物不生效的坑
这篇文章主要介绍了springboot中使用@Transactional注解事物不生效的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-26