Spring Boot:防止解码@RequestParam

时间:2017-06-09 10:36:02

标签: 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);
  }
}

现在,如果我通过

发送访问权限
curl localhost/rest/test/test?test=%C3%B6%20%C3%A4

我收到了输出:

Requested: ö ä

我想

Requested: %C3%B6%20%C3%A4

任何想法?

4 个答案:

答案 0 :(得分:4)

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

PS:这不是这个问题的完美答案。我只是为那些得到类似问题的人写这个答案并登陆这个帖子。

答案 1 :(得分:1)

如果只在一个地方需要此行为,则可以使用控制器主体内部的标准Java URLEncoder将参数编码回原始表单:

@RequestMapping("/test")
public ResponseEntity<String> test(@RequestParam final String test) {
  String encodedParam = URLEncoder.encode(test, "UTF-8");
  return ResponseEntity.ok("Requested: " + encodedParam);
}

答案 2 :(得分:0)

我最终确保收到的数据不包含无效字符。

private static final String VALID_URL_CHARACTER_PATTERN = "^[A-Za-z0-9-._~:/?#\\[\\]@!$&'()*+,;=`.]+$";

private static final String ensureEncoding(final Object obj) {
    if (obj == null) {
        return null;
    }
    String val = obj.toString();
    if (!val.matches(VALID_URL_CHARACTER_PATTERN)) {
        try {
            val = URLEncoder.encode(val, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            log.error("Unexpected encoding Problem on value: " + val, e);

        }
    }
    return val;
}

答案 3 :(得分: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);

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