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


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

URL中通過加占位符把參數傳向后台

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

畫面側

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

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

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是/mst_users/#/

但它找的是/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 傳輸吧

這些都是很個人的想法,如果有更好的請不吝分享

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM