Spring 當 @PathVariable 趕上 【. # /】等特殊字符

@PathVariable註解應該不是新鮮東西了Spring3.0就開始有了html

URL中經過加佔位符把參數傳向後臺ajax

舉個栗子,以下比較要說的內容比較簡單就大概齊的寫一下json

畫面側瀏覽器

$.ajax({ type : "GET", url : /test/code1, dataType : "html", success : function(data, status, xhr) { //TODO
 }, error : function(XMLHttpRequest, status, errorThrown) { //TODO
 } });

這裏的code1 就是你要傳入的參數了app

Contoller側函數

@RequestMapping(value = "/test/{code}", method = RequestMethod.GET) public String getTestName(@PathVariable String code) { //TODO
}

 [{code}]在URL中的佔位符,用@PathVariable註解來作映射
※這裏有一個注意點就是 url 中的 code 參數名 要和 @PathVariable 註解的這個 code 參數名要一致
背景算是說完了,如今就能夠拿着用了
接下來講遭遇的問題 先說[#]
若是你入力的內容中包含#號那麼就是悲劇了
要麼404 要麼找的不對而後畫面崩潰學習

若是你沒報出404的狀況有多是由於他找到了初期化的那個函數並不是你期待的那個編碼

好比,以下url

雖然的url是/mst_users/#/spa

但它找的是/mst_users後面的#號被無視了

咱們期待的是下面的這個函數

 

@RequestMapping(value = "/mst_users/{userId}", method = RequestMethod.GET)
    @ResponseBody
    public String getSkuName(@PathVariable("userId") String userId,HttpServletRequest request) {

 


這時候的解決方案就是轉碼
先找到了escape()函數還有以下
【該特性已經從 Web 標準中刪除,雖然一些瀏覽器目前仍然支持它,但也許會在將來的某個時間中止支持,請儘可能不要使用該特性。
廢棄的 escape() 方法生成新的由十六進制轉義序列替換的字符串. 使用 encodeURI 或 encodeURIComponent 代替.】
雖然不推薦但能夠先試試

如今已經明顯看到 # 被編譯成 %23 ok繼續走

 

果真此次進到了咱們期待的函數了且 %23也自動解碼成#了

ps encodeURIComponent函數也試過了沒問題這裏就不貼代碼了

他們的主要的區別就是各個函數的編碼和不編碼的範圍不同須要的本身查一下吧

繼續說當遇到[.]

這個也比較有意思 若是你傳入的相似 1.2 、a.b 這樣的那麼 後天接收到的多是這樣的

1.2  → 1

a.b   a

 

即便用了轉碼函數也沒用由於剛剛說的那個兩個函數都不會都【.】進行轉碼的

找到了兩個解決方法

①在URL得佔位參數後面加上【:.+】

  好比  /mst_users/{userId} → /mst_users/{userId:.+}

②在本來的後面加【.{ext}】固然你的函數列表裏也得追加 【@PathVariable("ext") String ext】

  就是把【.】先後分紅了兩個參數來接收

看一下①的效果吧

 

 

 

②就不貼圖了 說一下問題吧

①和②都有的問題 就是 若是隻輸入 【.】的話都會報錯仍是找不到對的函數

 這是比較鬱悶的就是說即便用了這些解決辦法仍是不能接受任意的輸入

可能仍是要配合相應的check來使用吧...

ps:【/】同【.】就不贅述了...

------------------------------------------------------------------------------------------------

若是你是任性期待能夠接收任意輸入的 也不是絕對不行

好比 本身定義 把【.】【/】對應的轉換特定的字符而後到後臺在轉換出來

可是呢 這樣吧 一是不夠哦優雅或者直接能夠說成笨拙 二就是有個bug

既然你已經任性的能夠輸入任意了那麼別人的輸入就是你的特定字符這就尷尬

因此必要的check仍是少不了的 僅是私覺得 若是有什麼好的也請告知,學習

------------------------------------------------------------------------------------------------

最後的比較靠譜的解決方案

一就是上面寫的兩個解決方法 + 對應的check

二就是這種URL裏傳值的方式就被放棄之間 換成傳統的json 傳輸吧

這些都是很我的的想法,若是有更好的請不吝分享

相關文章
相關標籤/搜索