微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么括号之类的某些字符会在 Spring REST 端点中导致 400 BAD REQUEST 错误?

如何解决为什么括号之类的某些字符会在 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 举报,一经查实,本站将立刻删除。