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

标签:SpringBoot,自定义,错误页面
0
投稿

猜你喜欢

  • Java双向链表的操作

    2021-07-31 02:54:33
  • JavaWeb框架MVC设计思想详解

    2022-09-09 06:43:50
  • Java项目实现寻找迷宫出路

    2022-10-05 14:08:46
  • JAVA使用POI获取Excel的列数与行数

    2021-10-03 12:53:37
  • 关于springboot 配置文件中属性变量引用方式@@解析

    2023-12-08 21:50:03
  • c# 解决IIS写Excel的权限问题

    2021-08-21 03:23:34
  • Java线程之守护线程(Daemon)用法实例

    2023-11-29 09:15:13
  • IDEA 2020.3.X 创建scala环境的详细教程

    2022-07-16 11:44:47
  • SpringMVC实现多文件上传

    2023-10-12 16:49:15
  • SpringBoot动态修改yml配置文件的方法详解

    2023-06-20 16:14:34
  • Java递归实现迷宫游戏

    2023-08-26 07:33:16
  • 必须要学会的JMM与volatile

    2021-07-30 14:07:53
  • 详解maven中profiles使用实现

    2022-11-13 23:14:24
  • SWT(JFace)体验之ViewForm的使用

    2023-10-20 13:02:01
  • Android开发之SQLite的使用方法

    2022-11-12 05:26:38
  • IntelliJ IDEA 好用插件之analyze inspect code详解

    2021-09-26 22:16:36
  • android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)

    2023-02-22 16:18:35
  • Spark JDBC操作MySQL方式详细讲解

    2021-05-24 12:41:51
  • Java多线程事务管理的实现

    2023-07-26 22:58:20
  • Spring AOP实现复杂的日志记录操作(自定义注解)

    2023-01-24 15:21:50
  • asp之家 软件编程 m.aspxhome.com