2016-11-30 204 views
1

我有以下URL處理的REST API的特殊字符

http://context_path/info/abc/def 

其被轉換像

http://context_path/info/abc%2Fdef 

凡爲我的控制器映射爲:

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 

這裏「身份證'包含正斜槓(/)。所以當我打到網址時,我收到400錯誤請求

我知道可能的解決方案

  • 設置tomcat的允許正斜槓。
  • 使用URL編碼。使用@RequestParam代替@PathVariable

但上面的解決方案對我來說是不可能的。

問:是否有任何其他解決方案像(使用正則表達式或更改映射或其他任何東西)的問題? 此外,tomcat如何正確處理其他特殊字符('。',''',':',','),並且控制器被打中,但不是'/'

嘗試,但不工作:

1) @RequestMapping(value = "/info/{id:.*}", method = RequestMethod.GET) 
2) @RequestMapping(value = "/info/{id}/**", method = RequestMethod.GET) 
3) @RequestMapping(value = "/info/**", method = RequestMethod.GET) 
+0

的可能的複製[匹配「其餘的URL」使用Sp ring 3 RequestMapping Annotation](http://stackoverflow.com/questions/4542489/match-the-rest-of-the-url-using-spring-3-requestmapping-annotation) – user1211

+0

但是爲什麼有一個斜槓在你的ID值? – ScanQR

+0

@TechBreak我知道它錯了。但我正在研究舊的價值觀,我無法修改這些。 – SuhasD

回答

1

這不是很好,但你可以使用Base64 transformation

因此,您的客戶端將發送一個編碼的id,然後在控制器中將其解碼。

import org.apache.commons.codec.binary.Base64; 

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 
public String get(@PathVariable String id) { 
    final String realId = new String(new Base64(true).encodeBase64URLSafe(id)); 
    [...] 
} 

編輯:您應該使用網址,以節省Base64編碼的實施

+0

這是行不通的。 Spring將解碼或取消映射url,然後嘗試根據生成的URL調用處理程序方法。因此它將作爲不良請求返回。 – ScanQR

+0

@TechBreak你試過了嗎?我現在正在嘗試,它的工作原理。 – dit

+0

@dit Base64運行良好,但只要它包含'?'就發出它。然後它將它轉換成'/'。任何其他編碼器誰不使用'/'進行編碼? – SuhasD

-1
+0

我添加以下Reg-EX [\\ [\\] A-Za-z0-9 \'',():._^- ] +。適用於除'/'以外的所有其他特殊字符,並且如果我像[\\/\\ [\\] A-Za-z0-9 \'',():._^- ] +那樣修改上述Reg-EX,則沒有URL正在工作(即使那些正在使用舊的Reg-EX) – SuhasD

0

您可以使用類似這樣 How to handle requests that includes forward slashes (/)?

但是它有它的侷限性,我建議你換成別的東西像「#」斜槓而調用API,然後再更換回來在休息控制器中處理之前轉發斜線。

如果在調用API時進行替換是不可能的,那麼您可以使用過濾器並在那裏替換數據。