Spring Boot 如何处理java.lang.非法参数异常:在Sping Boot 的请求目标中找到无效字符

gab6jxml  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(260)

我正在尝试验证下面的请求URL。

  1. http://localhost:8081/api/projects?modifiedAt=2023-02\27

由于“\”字符,这将导致错误;

  1. java.lang.IllegalArgumentException: Invalid character found in the request target [/api/projects?modifiedAt=2023-02\27 ]. The valid characters are defined in RFC 7230 and RFC 3986
  2. at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:494) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  3. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  4. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  5. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  6. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  7. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  8. at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  9. at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  10. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.71.jar:9.0.71]
  11. at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

为了捕获这个错误,我创建了一个异常处理程序,如下所示

  1. @ExceptionHandler(IllegalArgumentException.class)
  2. private ResponseEntity<ApiResponseDTO> handleIllegalArgumentException(IllegalArgumentException ex){
  3. log.info("IllegalArgumentException {} ", ex);
  4. List<String> errors = List.of(ex.getMessage());
  5. ApiResponseDTO<?> serviceResponse = ApiResponseDTO.builder()
  6. .status(ERROR)
  7. .errors(errors)
  8. .httpStatus(HttpStatus.BAD_REQUEST)
  9. .timestamp(ZonedDateTime.now(ZoneId.of("Z")))
  10. .build();
  11. return new ResponseEntity<>(serviceResponse, HttpStatus.NOT_FOUND);
  12. }

但这个错误没有命中。
知道我们如何在Sping Boot 中捕获此错误吗

huwehgph

huwehgph1#

我能够在Setting 'relaxedQueryChars' for embedded Tomcat的帮助下修复这个问题
此链接也很有用https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#application-properties.server.server.tomcat.relaxed-query-chars
在www.example.com文件中添加了以下属性application.properties

  1. server.tomcat.relaxed-path-chars=\\
  2. server.tomcat.relaxed-query-chars=\\

相关问题