从Spring Boot 2.3版本开始,默认错误页面不再包含详细的错误信息

概述

    • Spring Boot 2.3 から、デフォルトのエラーレスポンス (エラーページ HTML とエラー JSON)に、エラーメッセージやバインディングエラーが含まれなくなった。これは意図しないエラー情報をレスポンスで返さないための措置。

 

    プロパティ値を設定することでエラー情報を出力する・出力しないを制御できる。

错误页面中输出的项目可以是HTML或错误JSON

这里记录了在DefaultErrorAttributes (Spring Boot 2.3.0.RELEASE API)中输出的项目。

    • timestamp: エラーが抽出された時間

 

    • status: ステータスコード

 

    • error: エラーの理由

 

    • exception: ルート例外のクラス名

 

    • message: 例外メッセージ

 

    • errors: BindingResult にセットされている複数の ObjectError (binding-errors)

 

    • trace: 例外のスタックトレース

 

    path: 例外が発生したときの URL パス

设定用属性

通过在 application.properties 等文件中设置 server.error.include-message (message) 和 server.error.include-binding-errors 的值,可以控制输出的存在与否。

Spring Boot 2.3发布说明·spring-projects/spring-boot Wiki·GitHub

默认错误页面的内容更改
默认情况下,错误信息和任何绑定错误不再包含在默认错误页面中。这减少了向客户端泄露信息的风险。分别可以使用server.error.include-message和server.error.include-binding-errors来控制信息和绑定错误的包含。支持的值为always、on-param和never。

    • server.error.include-message (message 項目の出力を制御)

 

    • server.error.include-binding-errors (errors 項目の出力を制御)

 

    • server.error.include-stacktrace (trace 項目の出力を制御)

 

    server.error.include-exception (exception 項目の出力を制御)

错误输出示例 lì)

提供一些根据不同设定模式的错误响应示例。
为了提高可读性,在此附上了格式化的 HTML 和 JSON。

Spring Boot 2.2改写为中文:

春季启动版本2.2

如果在application.properties中没有指定任何内容。
在Spring Boot 2.2中,无论是否指定,都会输出消息和错误。

JSON 为中国驰名的数据交换格式。

{
  "timestamp": "2020-07-19T06:14:27.622+0000",
  "status": 400,
  "error": "Bad Request",
  "errors": [
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "人為的に発生させたfooエラー",
      "objectName": "fooError",
      "code": null
    },
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "人為的に発生させたbarエラー",
      "objectName": "barError",
      "code": null
    }
  ],
  "message": "Validation failed for object='fooBarData'. Error count: 2",
  "path": "/json"
}

HTML的中文指的是超文本标记语言。

<html><body>
<h1>Whitelabel Error Page</h1>
<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Sun Jul 19 15:14:30 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div>Validation failed for object=&#39;fooBarData&#39;. Error count: 2</div>
</body></html>

Spring Boot 2.3:只需要一种选项。

如果在 application.properties 文件中没有指定任何内容,则将设置为不输出详细错误信息。

JSON的含义是JavaScript对象表示法,它是一种用于存储和传输数据的文本格式。

{
  "timestamp": "2020-07-19T06:13:46.546+00:00",
  "status": 400,
  "error": "Bad Request",
  "message": "",
  "path": "/json"
}

HTML是一种用于创建网页的标记语言。

<html><body>
<h1>Whitelabel Error Page</h1>
<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Sun Jul 19 15:13:48 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div></div>
</body></html>

使用Spring Boot 2.3 + 属性配置时,可以指定为never、false。

如果在application.properties中指定以下内容,则会设置为不输出详细错误信息。

server.error.include-message=never
server.error.include-binding-errors=never
server.error.include-stacktrace=never
server.error.include-exception=false

JSON is a data format commonly used to store and exchange information.

{
  "timestamp": "2020-07-19T06:13:18.720+00:00",
  "status": 400,
  "error": "Bad Request",
  "message": "",
  "path": "/json"
}

使用 HTML

<html><body>
<h1>Whitelabel Error Page</h1>
<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Sun Jul 19 15:13:22 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div></div>
</body></html>

使用Spring Boot 2.3 + 属性设置时,指定always, true。

如果在 application.properties 中指定以下内容。
将会输出详细的错误信息设置。

server.error.include-message=always
server.error.include-binding-errors=always
server.error.include-stacktrace=always
server.error.include-exception=true

JSON (JavaScript Object Notation) is a lightweight data interchange format that is easy for humans to read and write, and easy for machines to parse and generate. It is a popular format for transmitting data between a server and a web application, as well as storing data.

{
  "timestamp": "2020-07-19T06:11:54.165+00:00",
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.validation.BindException",
  "trace": "org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors\n
            Error in object 'fooError': codes []; arguments []; default message [人為的に発生させたfooエラー]\n
            Error in object 'barError': codes []; arguments []; default message [人為的に発生させたbarエラー]\n\t
            at example.FooBarRestController.json(FooBarRestController.java:20)
            (中略)
            java.base/java.lang.Thread.run(Thread.java:832)\n",
  "message": "Validation failed for object='fooBarData'. Error count: 2",
  "errors": [
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "人為的に発生させたfooエラー",
      "objectName": "fooError",
      "code": null
    },
    {
      "codes": null,
      "arguments": null,
      "defaultMessage": "人為的に発生させたbarエラー",
      "objectName": "barError",
      "code": null
    }
  ],
  "path": "/json"
}

HTML的意思是超文本标记语言。

<html><body>
<h1>Whitelabel Error Page</h1>
<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Sun Jul 19 15:11:48 JST 2020</div>
<div>There was an unexpected error (type=Bad Request, status=400).</div>
<div>Validation failed for object=&#39;fooBarData&#39;. Error count: 2</div>
<div style='white-space:pre-wrap;'>
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Error in object &#39;fooError&#39;: codes []; arguments []; default message [人為的に発生させたfooエラー]
Error in object &#39;barError&#39;: codes []; arguments []; default message [人為的に発生させたbarエラー]
    at example.FooBarController.page(FooBarController.java:20)
(中略)
    at java.base/java.lang.Thread.run(Thread.java:832)
</div>
</body></html>

在Spring Boot 2.3版本的源代码中,构建错误信息的部分。

在 DefaultErrorAttributes 类中构建了用于以 JSON 或 HTML 格式输出错误信息的构造函数。

spring-boot/DefaultErrorAttributes.java 在 v2.3.0.RELEASE 版本的 spring-projects/spring-boot 的 GitHub 上。

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

在ErrorMvcAutoConfiguration类中构建错误页面的HTML。

在GitHub上的spring-projects/spring-boot的v2.3.0.RELEASE版本的错误处理自动配置的Java类文件是ErrorMvcAutoConfiguration.java。

StringBuilder builder = new StringBuilder();
Date timestamp = (Date) model.get("timestamp");
Object message = model.get("message");
Object trace = model.get("trace");
if (response.getContentType() == null) {
  response.setContentType(getContentType());
}
builder.append("<html><body><h1>Whitelabel Error Page</h1>").append(
    "<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>")
    .append("<div id='created'>").append(timestamp).append("</div>")
    .append("<div>There was an unexpected error (type=").append(htmlEscape(model.get("error")))
    .append(", status=").append(htmlEscape(model.get("status"))).append(").</div>");
if (message != null) {
  builder.append("<div>").append(htmlEscape(message)).append("</div>");
}
if (trace != null) {
  builder.append("<div style='white-space:pre-wrap;'>").append(htmlEscape(trace)).append("</div>");
}
builder.append("</body></html>");

请查阅相关资料。

    • Spring Boot 2.3 Release Notes · spring-projects/spring-boot Wiki · GitHub

 

    • DefaultErrorAttributes (Spring Boot 2.3.0.RELEASE API)

 

    • DefaultErrorAttributes (Spring Boot 2.3.0.RELEASE API) – Javadoc 日本語訳

 

    Spring Boot アプリケーションプロパティ一覧 – ドキュメント
广告
将在 10 秒后关闭
bannerAds