SpringBoot多種自定義錯(cuò)誤頁(yè)面方式小結(jié)
在項(xiàng)目中為了友好化,對(duì)于錯(cuò)誤頁(yè)面,我們常常會(huì)使用自定義的頁(yè)面。SSM框架組合時(shí)代,我們通常通過攔截或者在web.xml中設(shè)置對(duì)于錯(cuò)誤碼的錯(cuò)誤頁(yè)面,然而到了SpringBoot,web.xml消失了,SpringBootServletInitializer初始化servlet代替了web.xml。難道要再把web.xml加回去?這樣雖然可以做到,但并不合理。
下面提供了多種在SpringBoot中實(shí)現(xiàn)自定義錯(cuò)誤頁(yè)面的方法。
以前web.xml方式
先來看下在web.xml中配置錯(cuò)誤頁(yè)面的方式:
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
SpringBoot中實(shí)現(xiàn)方式
在SpringBoot后,可以通過如下幾種方式實(shí)現(xiàn)自定義錯(cuò)誤頁(yè)面。
1.實(shí)現(xiàn)EmbeddedServletContainerCustomizer的bean
適合內(nèi)嵌服務(wù)器,先在controller中定義我們的錯(cuò)誤頁(yè)面Mapping,通過在配置類中實(shí)現(xiàn)EmbeddedServletContainerCustomizer的bean,加入對(duì)應(yīng)狀態(tài)碼的錯(cuò)誤頁(yè)面。注意這種方式在打成war后,供外部tomcat使用時(shí),將會(huì)失效。
定義錯(cuò)誤頁(yè)面:
@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:
/**
* 配置默認(rèn)錯(cuò)誤頁(yè)面(僅用于內(nèi)嵌tomcat啟動(dòng)時(shí))
* 使用這種方式,在打包為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.通過攔截器方式
適合內(nèi)嵌Tomcat或者war方式。
/**
* @author hgs
* @version ErrorPageInterceptor.java, v 0.1 2018/03/04 20:52 hgs Exp $
* <p>
* 錯(cuò)誤頁(yè)面攔截器
* 替代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/**");默認(rèn)所有
super.addInterceptors(registry);
}
}
3.自定義靜態(tài)error頁(yè)面方法
在resource/templates下添加error.html頁(yè)面,springBoot會(huì)自動(dòng)找到該頁(yè)面作為錯(cuò)誤頁(yè)面,適合內(nèi)嵌Tomcat或者war方式。
SpringBoot錯(cuò)誤視圖提供了以下錯(cuò)誤屬性:
timestamp:錯(cuò)誤發(fā)生時(shí)間;status:HTTP狀態(tài)嗎;error:錯(cuò)誤原因;exception:異常的類名;message:異常消息(如果這個(gè)錯(cuò)誤是由異常引起的);errors:BindingResult異常里的各種錯(cuò)誤(如果這個(gè)錯(cuò)誤是由異常引起的);trace:異常跟蹤信息(如果這個(gè)錯(cuò)誤是由異常引起的);path:錯(cuò)誤發(fā)生時(shí)請(qǐng)求的URL路徑。
SpringBoot使用的前端框架模板不同,頁(yè)面的名稱也有所不同:
- 實(shí)現(xiàn)Spring的View接口的Bean,其ID需要設(shè)置為error(由Spring的BeanNameViewResolver所解析);
- 如果配置了Thymeleaf,則需命名為error.html的Thymeleaf模板;
- 如果配置了FreeMarker,則需命名為error.ftl的FreeMarker模板;
- 如果配置了Velocity,則需命名為error.vm的Velocity模板;
- 如果是用JSP視圖,則需命名為error.jsp的JSP模板。
Thymeleaf實(shí)例:
<!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 內(nèi)容 -->
<div class="panel-l container clearfix">
<div class="error">
<p class="title"><span class="code" th:text="${status}"></span>非常抱歉,沒有找到您要查看的頁(yè)面</p>
<a href="/" rel="external nofollow" class="btn-back common-button">返回首頁(yè)
<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>
對(duì)于外部Tomcat第三中方案是比較推薦的一種實(shí)現(xiàn)方式,但不夠靈活,我們不好定義自己的屬性,如果想對(duì)其做相應(yīng)修改,可以參見源碼BasicErrorController,通過繼承AbstractErrorController,并重寫errorHtml方法,達(dá)到自己想要的效果。在內(nèi)嵌Tomcat時(shí),第一種推薦使用,更具靈活性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springMVC使用ajaxFailUpload上傳圖片的方法
這篇文章主要介紹了springMVC使用ajaxFailUpload上傳圖片的相關(guān)知識(shí),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
Java8中CompletableFuture使用場(chǎng)景與實(shí)現(xiàn)原理
CompletableFuture是java8引入的新類,該類實(shí)現(xiàn)了Future接口和 CompletionStage接口,封裝了future、forkjoin相關(guān)類來執(zhí)行異步,這篇文章主要給大家介紹了關(guān)于Java8中CompletableFuture使用場(chǎng)景與實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2022-02-02
Java使用easyExcel實(shí)現(xiàn)導(dǎo)入功能
這篇文章介紹了Java使用easyExcel實(shí)現(xiàn)導(dǎo)入功能的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
Java判斷中英文符號(hào)、標(biāo)點(diǎn)的實(shí)現(xiàn)
本篇文章主要介紹了Java判斷中英文符號(hào)、標(biāo)點(diǎn)的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
mybatis通過XML的方式拼接動(dòng)態(tài)sql
動(dòng)態(tài)SQL是一種在運(yùn)行時(shí)構(gòu)造和執(zhí)行SQL語(yǔ)句的技術(shù),這篇文章主要為大家介紹了mybatis如何通過XML的方式拼接動(dòng)態(tài)sql,有需要的小伙伴可以參考一下2024-12-12
SpringBoot實(shí)現(xiàn)redis緩存菜單列表
本文主要介紹了SpringBoot實(shí)現(xiàn)redis緩存菜單列表,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

