Spring Boot 3.2.12 启动报错:400 非法路径字符
问题解决方案
1. 处理Jetty路径非法字符导致的400错误
Jetty 12.0.15收紧了URL路径字符的校验规则,你的API路径中包含的"(转义后为%22)属于默认被拦截的字符。可通过启动阶段配置Jetty放宽校验:
方式一:自定义Jetty配置Bean(Spring Boot)
创建配置类,通过JettyServerCustomizer修改HttpParser的允许字符列表:
import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JettyCustomConfig { @Bean public JettyServerCustomizer jettyPathCharacterCustomizer() { return server -> { for (ServerConnector connector : server.getConnectors()) { for (HttpConnectionFactory factory : connector.getConnectionFactories(HttpConnectionFactory.class)) { HttpConfiguration config = factory.getHttpConfiguration(); // 添加需要允许的特殊字符,示例为双引号,可按需追加其他字符如{}[]等 config.getHttpParser().setAllowedPathCharacters("\""); } } }; } }
方式二:通过系统属性配置(application.properties/yaml)
直接在配置文件中设置Jetty的系统属性:
# application.properties org.eclipse.jetty.http.HttpParser.allowedPathCharacters="
# application.yaml org.eclipse.jetty.http.HttpParser.allowedPathCharacters: '"'
2. 解决logback-access的IncompatibleClassChangeError异常
该异常源于logback-access版本与Jetty 12不兼容:Jetty 12中org.eclipse.jetty.server.Request从类改为了接口,但旧版logback-access仍将其作为类调用。
解决方案
升级logback-access到支持Jetty 12的版本,Spring Boot 3.2.x默认管理的logback版本(1.4.11+)已适配Jetty 12,只需确保依赖版本正确:
Maven依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <!-- 无需手动指定版本,Spring Boot父依赖会自动引入兼容版本 --> </dependency>
Gradle依赖
implementation 'ch.qos.logback:logback-access'
内容的提问来源于stack exchange,提问作者at0107
相关产品推荐
相关产品推荐

