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时,第一种推荐使用,更具灵活性。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
下一篇: Mybatis实现分表插件