从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='fooBarData'. 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='fooBarData'. Error count: 2</div>
<div style='white-space:pre-wrap;'>
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Error in object 'fooError': codes []; arguments []; default message [人為的に発生させたfooエラー]
Error in object 'barError': 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 アプリケーションプロパティ一覧 – ドキュメント