为什么括号之类的字符会在spring rest端点中导致400错误请求错误?

muk1a3rh  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(333)

我试图在spring应用程序中调用通过get方法公开的restapi。在发送请求时,我注意到控制器不支持某些字符,并在执行控制器代码之前立即返回一个400 bad\u请求错误。
复制错误的字符:

[]{}|\

所有其他字符(如以下字符)都不会重现该错误:

&+<>$?!@°*~#"'/

工作请求示例:

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,
        @RequestParam(required = false, name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,
        @RequestParam(required = false, 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>
drkbr07n

drkbr07n1#

您需要在客户端对url进行编码。 http://localhost:8083?a=asd[ 你应该以这个结束 http://localhost:8083?a=asd%5B 客户端通常提供url编码功能,请查看其文档。如果您正在使用postman这样的客户机进行测试,那么您可以右键单击地址栏,在那里您可以选择对url进行编码。
有些角色像 [ 被认为是允许的但不安全的字符,这就是为什么需要编码。
以后编辑:
我已经测试了你的代码和请求,一切正常。我所做的唯一更改是在controller方法中返回字符串而不是响应实体。

@RestController
class Ctrl {
    @GetMapping
    public String getEmails(
            @RequestParam(required = false, name = "a") String a,
            @RequestParam(required = false, name = "b") String b,
            @RequestParam(required = false, name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,
            @RequestParam(required = false, 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'` ![](https://i.stack.imgur.com/hNcKC.png)
您可以启用spring调试/跟踪日志记录并查看发生了什么。

相关问题