2017-06-09 184 views
0

我有一个运行在Tomcat 8.5上的Spring-Boot(1.5.3)应用程序。其中,我有一个RestController与单个参数。Spring Boot:防止解码@RequestParam

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

@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 

什么想法?

回答

0

如果需要此行为仅在一个地方,你可以将参数编码回用标准的Java URLEncoder控制身体内的原始形式:

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

嗨丹尼尔,谢谢,但这是一个解决方法,我想避免,因为它应该是可以避免en /解码anywhay – Aracos

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; 
} 
0

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

PS:这不是这个问题的完美答案。我只是为任何得到类似问题的人写这个答案,然后着陆到这个线程。