Spring Boot:防止对@RequestParam进行解码

Ara*_*cos 2 spring spring-mvc spring-boot

我有一个在Tomcat 8.5上运行的Spring-Boot(1.5.3)应用程序。在其中,我有一个带有单个参数的RestController。

此参数会自动解码-对我的应用程序中的所有其他控制器都很好,但是对此,我需要原始请求数据,因为它们将在另一个请求中使用。请注意,我希望仅对此控制器/请求禁用自动解码,并在其他地方保持正常行为。

@RestController
@RequestMapping("/rest/test")
public class TestController {

  @RequestMapping("/test")
  public ResponseEntity<String> test(@RequestParam final String test){
    return ResponseEntity.ok("Requested: " + test);
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我发送访问

curl localhost/rest/test/test?test=%C3%B6%20%C3%A4
Run Code Online (Sandbox Code Playgroud)

我收到输出:

Requested: ö ä
Run Code Online (Sandbox Code Playgroud)

我想拥有

Requested: %C3%B6%20%C3%A4
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Sah*_*bra 5

我对具有base64Encoded值的参数也遇到了类似的问题,但是对我来说,只有+符号被转换为space。如果我会使用URLEncoder.encode()方法,其他特殊字符也将被转换。因此,我通过在RequestBody中而不是RequestParam中传递参数来解决了这个问题。

PS:这不是这个问题的完美答案。我只是为遇到类似问题并落入此线程的任何人编写此答案。


Joh*_*pha 0

来自 Spring 团队https://github.com/spring-projects/spring-framework/issues/21577

URI uri = fromUriString(format("http://localhost:%s/%s", serverPort, "/myEndPoint"))
        .queryParam("param1", param1)
        .queryParam("base64Param", "{base64Param}")
        .build(base64Param);
Run Code Online (Sandbox Code Playgroud)

此语法将正确解释 URL 中的特殊字符,并避免任何额外的编码/解码。