自定义错误页不适用于带有“%”符号的URL。
如果在请求处理过程中发生错误,我将按预期获得带有错误页的响应。但是,如果我尝试在末尾使用'%'符号执行请求(如http://localhost:8080/some-path %),则会得到如下响应
<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 400 – Bad Request</h1></body></html>
我正在使用Sping Boot v2.7.2和Web Starter。错误控制器:
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError() {
return "error";
}
}
aplication.yml:
spring:
web:
resources:
add-mappings: false
mvc:
throw-exception-if-no-handler-found: true
server:
error:
path: /error
whitelabel:
enabled: false
根据我的调查,错误发生在org.apache.catalina.connector.CoyoteAdapter#postParseRequest
// URI decoding
// %xx decoding of the URL
try {
req.getURLDecoder().convert(decodedURI.getByteChunk(), connector.getEncodedSolidusHandlingInternal());
} catch (IOException ioe) {
response.sendError(400, "Invalid URI: " + ioe.getMessage());
}
为什么不应用自定义响应?是否可以更改默认响应?
1条答案
按热度按时间jyztefdp1#
来自Spring项目成员的响应:
不幸的是我们对此无能为力向其发送请求的URI(http://localhost:8080/some-path %)无效,因为URL末尾的%编码字符不完整。这会导致Tomcat在请求处理的早期就失败,在它能够确定请求应该被路由到哪个上下文和servlet之前。因此,当发送400错误响应时,它无法被路由到Sping Boot 的自定义错误处理中。
标签:https://github.com/spring-projects/spring-boot/issues/35668