如何解决为什么括号之类的某些字符会在 Spring REST 端点中导致 400 BAD REQUEST 错误?
我正在尝试在 Spring 应用程序中调用通过 GET 方法公开的 REST API。发送请求时,我注意到控制器不支持某些字符,并在控制器代码执行之前立即返回 400 BAD_REQUEST 错误。
重现错误的字符:
[]{}|\
以下所有其他字符都不会重现该错误:
&+<>$?!@°*~#"'/
工作请求示例:
http://localhost:8888/api?a=&b=Hello&c=&d=&e=0&f=1
非工作请求示例:
http://localhost:8888/api?a=&b=%5BHello&c=&d=&e=0&f=1
字符在字符串中的位置对这个错误没有任何影响。 当任何字符串参数中存在上述六个字符之一时,就会发生此错误。
这是控制器代码:
@GetMapping
public ResponseEntity<Object> getEmails(
@RequestParam(required = false,name = "a") String a,@RequestParam(required = false,name = "b") String b,name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,name = "d") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime d,@RequestParam(name = "e") Integer e,@RequestParam(name = "f") Integer f
) {
return new ResponseEntity<>(myService.doSomeStuff(a,b,c,d,e,f),HttpStatus.OK);
}
我们使用 Spring 以及以下 Jackson 依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.3</version>
</dependency>
解决方法
您需要在客户端对 URL 进行编码。
http://localhost:8083?a=asd[
你应该以这个结束
http://localhost:8083?a=asd%5B
客户端通常提供 URL 编码功能,请查看其文档。如果您使用像 Postman 这样的客户端进行测试,那么您可以在地址栏中右键单击,然后您就可以选择对 URL 进行编码。
一些像 [
这样的字符被认为是允许但不安全的字符,这就是需要编码的原因。
后期编辑:
我已经测试了您的代码和请求,一切正常。我所做的唯一更改是在控制器方法中返回字符串而不是响应实体。
@RestController
class Ctrl {
@GetMapping
public String getEmails(
@RequestParam(required = false,name = "a") String a,@RequestParam(required = false,name = "b") String b,name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,name = "d") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime d,@RequestParam(name = "e") Integer e,@RequestParam(name = "f") Integer f
) {
return "";
}
}
curl --location --request GET 'http://localhost:8083?a=&b=%5BHello&c=&d=&e=0&f=1'
您可以启用 spring 调试/跟踪日志记录并查看发生了什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。