您好,登錄后才能下訂單哦!
這篇文章主要講解了“SpringBoot自定義錯誤頁面方式有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“SpringBoot自定義錯誤頁面方式有哪些”吧!
先來看下在web.xml中配置錯誤頁面的方式:
<error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page>
在SpringBoot后,可以通過如下幾種方式實現(xiàn)自定義錯誤頁面。
適合內(nèi)嵌服務(wù)器,先在controller中定義我們的錯誤頁面Mapping,通過在配置類中實現(xiàn)EmbeddedServletContainerCustomizer的bean,加入對應(yīng)狀態(tài)碼的錯誤頁面。注意這種方式在打成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:
/** * 配置默認(rèn)錯誤頁面(僅用于內(nèi)嵌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); };
適合內(nèi)嵌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/**");默認(rèn)所有 super.addInterceptors(registry); } }
在resource/templates下添加error.html頁面,springBoot會自動找到該頁面作為錯誤頁面,適合內(nèi)嵌Tomcat或者war方式。
SpringBoot錯誤視圖提供了以下錯誤屬性:
timestamp
:錯誤發(fā)生時間;
status
:HTTP狀態(tài)嗎;
error
:錯誤原因;
exception
:異常的類名;
message
:異常消息(如果這個錯誤是由異常引起的);
errors
:BindingResult異常里的各種錯誤(如果這個錯誤是由異常引起的);
trace
:異常跟蹤信息(如果這個錯誤是由異常引起的);
path
:錯誤發(fā)生時請求的URL路徑。
SpringBoot使用的前端框架模板不同,頁面的名稱也有所不同:
實現(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實例:
<!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>非常抱歉,沒有找到您要查看的頁面</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第三中方案是比較推薦的一種實現(xiàn)方式,但不夠靈活,我們不好定義自己的屬性,如果想對其做相應(yīng)修改,可以參見源碼BasicErrorController,通過繼承AbstractErrorController,并重寫errorHtml方法,達(dá)到自己想要的效果。在內(nèi)嵌Tomcat時,第一種推薦使用,更具靈活性。
感謝各位的閱讀,以上就是“SpringBoot自定義錯誤頁面方式有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對SpringBoot自定義錯誤頁面方式有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。