SpringBoot2.1.4错误处理机制
前面一片已经介绍了springboot错误处理的机制,其实从整个分析过程中我们已经大概知道如何定制了。

1、错误页面自定义

springboot有个默认的错误页面,但是开发时错误页面肯定是自己定义的。那该如何定义?
在DefaultErrorViewResolver类中有下面几个方法,

private ModelAndView resolve(String viewName, Map<String, Object> model) {// 定义视图名,这里我们可以确定视图名:error/错误码,例如:error/404,String errorViewName = "error/" + viewName;// 这里结合上面的errorViewName,其实就是在template目录下的error目录进行查找// 我们默认情况下是没有error目录,这里的provide最终值为null,代码较多就不一一展示,有兴趣的可以跟下去TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);// 根据判定,这里会接着调用下面的resolveResource方法return provider != null ? new ModelAndView(errorViewName, model) : this.resolveResource(errorViewName, model);
}private ModelAndView resolveResource(String viewName, Map<String, Object> model) {//  getStaticLocations()获取的是静态资源路径:"classpath:/META-INF/resources/", "classpath:/resources/","classpath:/static/", "classpath:/public/"String[] var3 = this.resourceProperties.getStaticLocations();int var4 = var3.length;// 遍历上面的4个静态资源路径for(int var5 = 0; var5 < var4; ++var5) {String location = var3[var5];try {Resource resource = this.applicationContext.getResource(location);// 创建resource对象,例如error/404.htmlresource = resource.createRelative(viewName + ".html");// 查找在对应静态资源目录下是否有上面的这个资源对象,有就创建视图对象if (resource.exists()) {return new ModelAndView(new DefaultErrorViewResolver.HtmlResourceView(resource), model);}} catch (Exception var8) {;}}// 都没找到就返回null,默认情况下是不存在error目录的,所以这里最终返回nullreturn null;
}

在解析错误视图界面时,会依次去这几个目录:template/classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/,在这些目录下的error目录里找文件名是错误状态码的页面文件(404、500…)。
        所以我们可以在这些目录下创建error目录,在里面创建HTML页面,但是在template下面的页面才能被thymeleaf模板引擎识别。

现在再去访问不存在路径时效果如下,因为是404错误

但是,错误状态码是很多的,不可能将所有的页面全部写出来,在DefaultErrorViewResolver类中有下面一段静态代码:

static {Map<Series, String> views = new EnumMap(Series.class);views.put(Series.CLIENT_ERROR, "4xx");views.put(Series.SERVER_ERROR, "5xx");SERIES_VIEWS = Collections.unmodifiableMap(views);
}

向map中添加了两个数据"4xx"、“5xx”,这个表示4开头或者5开头的错误,并且看到下面的:

 public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {// 按状态码精确查找ModelAndView modelAndView = this.resolve(String.valueOf(status.value()), model);// 若精确查找未找到再来模糊查找// status.series()方法可以自己看一下,就是在获取错误码的首位if (modelAndView == null && SERIES_VIEWS.containsKey(status.series())) {modelAndView = this.resolve((String)SERIES_VIEWS.get(status.series()), model);}return modelAndView;}

上面注释写的很清楚了,springboot首先按错误精确查找,若为找到再以错误码首位模糊查找,所以我们也可以将错误页面文件定义成 4xx.html 或者 5xx.html。

2、错误数据

2.1 默认错误数据

页面搞定了,那默认的错误数据有哪些呢?响应浏览器或者移动端错误请求的两个方法中都同时用到了getErrorAttributes方法,这个方法就是用来获取错误数据的。

    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {HttpStatus status = this.getStatus(request);Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));response.setStatus(status.value());ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);return modelAndView != null ? modelAndView : new ModelAndView("error", model);}@RequestMappingpublic ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));HttpStatus status = this.getStatus(request);return new ResponseEntity(body, status);}

这个方法是属于DefaultErrorAttributes类的,用来定义默认错误属性。

    public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {Map<String, Object> errorAttributes = new LinkedHashMap();errorAttributes.put("timestamp", new Date());this.addStatus(errorAttributes, webRequest);this.addErrorDetails(errorAttributes, webRequest, includeStackTrace);this.addPath(errorAttributes, webRequest);return errorAttributes;}

从这个方法及其里面调用其他几个方法跟踪可以知道有如下错误属性:

  • timestamp:时间戳
  • status:错误码
  • error:错误名
  • exception:异常类型
  • message:异常信息
  • trace:错误栈
  • path:错误路径

2.2 自定义错误数据

下面模拟一个场景,发起一个请求,然后触发一个自定义异常,自己添加一些错误信息,在页面上显示出来。
exception:

public class MyException extends RuntimeException {public MyException() {super("发生异常了");}
}

Controller:

@ResponseBody
@RequestMapping("/hello")
public String hello(@RequestParam("username") String username){// 当username值为aaa是抛出异常if(username.equals("aaa")){throw new MyException();}return "hello";
}

为了处理异常还要定义个异常处理器,关键点1:注意设置状态码的注释

@ControllerAdvice
public class ExceptionController {@ExceptionHandler(MyException.class)public String f(HttpServletRequest request){// 这里要更改状态码,前面访问路径是没有问题的,所以状态码为200// 若想要进入springboot错误处理流程,必须重设状态码// 并且其key值为:javax.servlet.error.status_coderequest.setAttribute("javax.servlet.error.status_code",500);// 这里可以添加信息到request中,到后面的取出添加到map中request.setAttribute("data","我的错误消息");// 转发到 /error请求,交给springboot处理return "forward:/error";}}

关键点2,因为我们的错误信都是在DefaultErrorAttributes类中的getErrorAttributes方法中获取的,若只是到上面步骤为止,那么在移动端将无法获取到添加的data,所以为止同时使用浏览器和移动端,我们还必须创建一个类继承DefaultErrorAttributes类,重写getErrorAttributes方法,在这里才是真正的添加自定义的数据。
MyErrorAttribute

// 注意,给类必须添加到容器中,否则不生效
// 添加后将会覆盖原有的DefaultErrorAttributes,采用我们自己的MyErrorAtribute
@Component
public class MyErrorAtribute extends DefaultErrorAttributes {@Overridepublic Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {// 获取包含错误信息的mapMap<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);// 添加自己的错误数据map.put("company","lr");//获取转发过来时添加的数据// 第二个参数表示在哪个域中获取,0:request,1:sessionString data = (String)webRequest.getAttribute("data", 0);map.put("data",data); // 添加到mapreturn map;}
}

然后我们测试,浏览器端:

移动端:

这样,我们错误页面,错误消息自定义,浏览器和移动端适配都解决了。

Springboot错误页面和错误信息定制相关推荐

  1. ThinkPHP6项目基操(13.实战部分 项目中的自定义异常处理总结 错误页面API错误)

    项目中的自定义异常处理总结 错误页面&API错误 前言 一.异常分类 1. 控制器找不到 2. 方法找不到 3. 请求资源不存在 4. 系统內部异常.HTTP异常等 二.异常处理 1. 前置处 ...

  2. Tomcat删掉错误页面的版本信息

    Tomcat服务在响应404/500等网络错误时,默认会将当前版本信息显示出来,这样就造成了中间件版本信息泄露这样的漏洞 方案一:修改版本号 1.进入Tomcat下的lib目录,备份catalina. ...

  3. java错误页面显示错误信息_Struts2在JSP页面中显示错误信息和提示信息的方法

    Struts2在JSP页面中显示错误信息和提示信息的方法主要有以下四种. 注意:以下四种方法均需要使Action类继承ActionSupport类. 一.域级错误信息 ①重写Action中的valid ...

  4. IIS错误页面隐藏版本信息 - Web.Config customErrors配置

    目录 背景 分析暴露原因 解决办法 扩展学习customErrors使用方法 customErrors元素配置结构 元素属性 Mod 属性选项 示例 参考文章 背景 项目现按照国网的要求,测试后发现系 ...

  5. SpringBoot指南(六)——错误页面、单元测试、文件上传

    文章目录 1 错误页面 2 单元测试 3 文件上传 1 错误页面 对于机器客户端,SpringBoot生成JSON响应 对于浏览器客户端,SpringBoot响应whitelabel的错误页面 自定义 ...

  6. Vue中设置404错误页面【钢镚核恒】

    Vue错误页面 简介 错误页面:为了让用户在访问不到的情况下,有更好的体验和反馈 这里提供了使用步骤,上路! 有404.401组件模板,大家可以修改使用,或者自己动手造个更好的咯 上路 创建错误页面组 ...

  7. SpringBoot——错误处理机制 定制错误页面 (源码分析)

    目录 一.错误处理机制 二.ErrorPageCustomizer 三.BasicErrorController 四.DefaultErrorViewResolver 五.如何定制错误响应页面 六.D ...

  8. Spring Boot错误处理机制以及定制自己的错误页面

    在我们使用Spring Boot的过程中肯定有遇到过发生错误的时候,这个时候可能页面上出现的就是Spring Boot默认的错误界面,有的时候我们希望能显示我们自己设置的错误界面,或者携带我们自己的错 ...

  9. Spring boot定制错误页面

    定制错误页面 浏览器访问 如果,程序出错了 需要返回一个符合项目网站风格的页面 有模板引擎的情况下 error/状态码 将错误页面命名为,错误状态码.html 放在模板引擎文件夹里面的,error文件 ...

最新文章

  1. linux系统安装deamonsync,DAEMON Sync的使用心得体会。简易版家庭云服务器!正是我要的那种...
  2. mysql $lt_MongoDB与Mysql常用命令解释
  3. SSY and JLBD
  4. IPM: Enhance item implementation class
  5. python 密码学 模块_python学习-itsdangerous模块-黑马程序员技术交流社区
  6. 文言文能编程了,是噱头还是突破?
  7. mysql 约束 和索引_Mysql中索引和约束的示例语句
  8. 阶段3 2.Spring_08.面向切面编程 AOP_1 AOP的概念
  9. VS C++ vector结构体 增加元素 删除元素 获取第一个元素 最后一个元素 清空元素
  10. 网络系统设计的一般步骤
  11. c语言浮点数输出格式的控制,c语言输出格式控制
  12. 传统方法VS深度学习方法
  13. http405错误解决
  14. 函数签名function signature是什么意思
  15. NC65 用户密码重置
  16. SLAM基础——李群李代数
  17. 顶级程序员书单系列二:《编码-隐匿在计算机软硬件背后的语言》
  18. 和平精英为什么进不去显示无法连接服务器,和平精英为什么进不去 进不去解决方法[多图]...
  19. ampserv mysql升级_APMServ5.2.6升级PHP
  20. 泰坦尼克号 数据重构 + 可视化

热门文章

  1. 机器人或自动化类简历面试小技巧
  2. C语言两种方法实现归并排序
  3. 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手
  4. ROS从入门到精通5-5:局部路径规划插件开发案例(以DWA算法为例)
  5. 游戏防封技术是学易语言还是学c,易语言写游戏脚本防封执行sqlplus 之后没执行...
  6. 【奔腾的骏马---Html+CSS实现(附源代码)】
  7. 关于图片不变形适应屏幕的解决方法(vue为例)
  8. 微型计算机指令系统-移位指令
  9. 哈希算法(Hash函数)简单介绍
  10. 数据挖掘技术的应用领域