Spring Boot 自定义错误页不适用于带有“%”符号的URL

zi8p0yeb  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(439)

自定义错误页不适用于带有“%”符号的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());
            }

为什么不应用自定义响应?是否可以更改默认响应?

jyztefdp

jyztefdp1#

来自Spring项目成员的响应:
不幸的是我们对此无能为力向其发送请求的URI(http://localhost:8080/some-path %)无效,因为URL末尾的%编码字符不完整。这会导致Tomcat在请求处理的早期就失败,在它能够确定请求应该被路由到哪个上下文和servlet之前。因此,当发送400错误响应时,它无法被路由到Sping Boot 的自定义错误处理中。
标签:https://github.com/spring-projects/spring-boot/issues/35668

相关问题