2017-06-09 212 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:這不是這個問題的完美答案。我只是爲任何得到類似問題的人寫這個答案,然後着陸到這個線程。