SpringMVC中如何獲取@PathVariable的值
如何獲取@PathVariable的值
一、地址:**/{id}
@RequestMapping(value = "/del/{id}", method = RequestMethod.GET) public void del(HttpServletRequest request, @PathVariable("id") Long id){ System.out.println(id); }
二、方式
1、直接通過@PathVariable注解獲取
@RequestMapping(value = "/del/{id}", method = RequestMethod.GET) public void del(HttpServletRequest request, @PathVariable("id") Long id){ System.out.println(id); }
2、通用@PathVariable注解批量獲取, 只有注解的參數(shù)才能得到
@RequestMapping(value = "/del/{id}", method = RequestMethod.GET) public void del(HttpServletRequest request, @PathVariable("id") Long id){ NativeWebRequest webRequest = new ServletWebRequest(request); Map<String, Object> map = (Map<String, Object>) webRequest.getAttribute(View.PATH_VARIABLES, RequestAttributes.SCOPE_REQUEST); System.out.println(map.get("id")); }
3、批量獲取,不需要任何注解
@RequestMapping(value = "/del/{id}", method = RequestMethod.GET) public void del(HttpServletRequest request){ NativeWebRequest webRequest = new ServletWebRequest(request); Map<String, String> map = (Map<String, String>) webRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); System.out.println(map.get("id")); }
springmvc 使用@PathVariable時,應(yīng)該注意點什么?
近來在做庫存調(diào)劑系統(tǒng)時,我從前臺到后臺的傳值方式,主要包括:1個,用@PathVariable或者@RequestParam從路徑??;大于一個,用于更新或者添加操作的,我用的是表單實體傳到后臺;大于一個,用于查詢的,我用的@RequestBody(好吧,我承認這個只是我覺得好玩,但沒有多少人愿意在后臺一行又一行的寫:String test=request.getParameter("test");吧?????)
現(xiàn)在,主要就是想說一個從路徑取值的“坑”,而重中之重,就想說一下我更偏愛的@PathVariable(別問我為什么,/{param}/fn.do,簡單啊)
一、使用@PathVariable的轉(zhuǎn)變過程
首先:
在盤古開天辟地時,就是一切還很混沌時,姑娘我連用@PathVariable取值都沒有取過來,還蒙圈蒙了一小會兒,完全不明白發(fā)生了什么,因為我看著我的語法和格式,哪兒哪兒都對,但就是沒有傳過來值。我一想我原來寫/{param}/fn.do這種方式傳值的時候,也沒有問題呀,怎么今天是見鬼了???? 蒙圈完了之后,就發(fā)現(xiàn)端倪了。
請看看我怎么寫的哈:
@RequestMapping("/dealerStock/swapOrder/{orderID}/cancelAuditThisOrder.do") public @ResponseBody String cancelAuditThisOrder(@PathVariable("OrderID") String strOrderID)){ ... ... }
然后的然后,我就一直沒有請求到這個方法,更別談什么有沒有取到值的問題!后來解決的時候,真想一掌拍自己腦門上!
然后:
當代碼規(guī)范審查通過后,也經(jīng)過了測試部的一級功能業(yè)務(wù)測試以及業(yè)務(wù)部的二級業(yè)務(wù)流程測試。文檔之類的,都準備好了(我還能再說什么呢,無聲的兩個呵 呵) 正要布上去生產(chǎn)線的時候,老大再次審查了一遍代碼,審查到最后也沒個啥結(jié)果,但是,突然間看到那個@PathVariable就問了我兩個問題:
- 一、如果我的ID是不連續(xù)的,這種方法還能好使嗎?比如說:HC 782981;
- 二、是不是只要我拿到這個請求路徑,而我隨便推測一個ID號,就能避過用戶操作別人的數(shù)據(jù)?
姑娘我再次被雷擊倒,無言以對,馬上實際驗證。結(jié)果:Yes! 你說第一個的結(jié)果是Yes,這個我很滿意,但第二個是Yes,就很想哭了。 測試出結(jié)果后,就請命去干掉這個問題了。
我的第一步嘗試:
添加method=RequestMethod.post,也就是說用戶不能輸入Url地址以get的形式獲取數(shù)據(jù),只能通過系統(tǒng)內(nèi)部請求。
- 組長:你自己說,就算咱們改成了Post請求,你能不能訪問到?
- 姑娘:我能,就自己寫一個按鈕,再用post請求就行了。如果用戶里面有懂點程序編碼的,輕而易舉就能破掉。我再去改
- 組長:其實,我們只能防君子,哪個系統(tǒng)都有漏洞,沒有絕對的權(quán)限控制和安全,但咱們盡量的給做好。
我的第二步嘗試:
在第二步嘗試前,我想了一會兒。我發(fā)現(xiàn)這個事件有以下幾個突破口:
- 一、像訂單編號這個敏感的數(shù)據(jù),能不能做到不被推測出來?
- 二、用戶是根據(jù)訪問路徑,然后加上一個ID號去請求,如果用戶拿不到訪問路徑呢?
- 三、要點就是用戶只能操作自己的數(shù)據(jù),我可以在敏感操作的時候,同時校驗當前用戶。
- 四、既然都是@PathVariable這種方式帶來的一些問題,那我可以把相應(yīng)的方法,換掉這種傳值方式。
- 五、用戶看到的是一個請求方法路徑,我可不可以在路徑中加入隨機密碼鹽,進一步的控制關(guān)鍵操作的訪問。
好吧,為了方便迅速,我直接把這種傳值方式給改了。當然也沒有改完,時間關(guān)系,像一些本來就屬于公開數(shù)據(jù)的內(nèi)容,還是沒改。
我的第三步嘗試:
在第二步的時候,就已經(jīng)改完代碼了。然后,我覺得我是一個很較真的人。忙里偷閑,我把我在第二步嘗試中想到了幾個點,都寫代碼測了測。最先測出來的是第三種(同時檢驗當前用戶,也就簡單類似于where orderID=? and userID=? ) 其次,還測了測那個密碼鹽值,也確實能夠控制住,但是,想了想系統(tǒng)的性質(zhì)和資源的最終走向,沒改。然后,去禁止用戶打開開發(fā)者工具或者查看源代碼,然而,這根本不是我能控制住的。我也最多就是能控制住快捷鍵打開,但人家還有鼠標????????瀏覽器提供的功能,不是我想干掉就干掉滴滴滴滴。
我的第一個方案,就是改造訂單生成的方式,然后我覺得吧,這個好像不怎么靠譜。但毫無疑問比當前的生成方式要靠譜得太多,但這要改動下來,呃,原諒我很慫。
二、個人總結(jié)
我最大的問題,不是我后來想不出更為優(yōu)雅的方案去解決,而是,我從根本上,對這是個問題的問題毫無知覺。我甚至都不覺得那樣有什么問題,這才是我最該考慮的點。
其實,我用@PathVariable或者什么別的方式去傳值,這都無可厚非。但我也應(yīng)該更進一步的考慮到它的應(yīng)用場景和系統(tǒng)功能鎖涉及到的數(shù)據(jù),以及可能帶來的后果。就比如說我這個@PathVariable的問題,在別的查詢一些區(qū)域信息(公共展示數(shù)據(jù))的時候,我也這么用了,組長也看見了,但為什么他著重說了訂單這一塊,還要求這一塊必須改。反正,我就是欠思考。。。。。。
很多很多的東西,都是建立在日常生活體驗上的。我以前就很崇拜架構(gòu)師,現(xiàn)在也很崇拜。但是,我突然明白,架構(gòu)師也不是光有空架子的。就比如說我自己吧,我還算是亂七八糟的想法挺多的那種(雖然并不是每個都靠譜)但是,做事情不能光憑想象,要實際操作的。
感覺最近做得比較好一點的就是:
1,因為有一個地方查詢的數(shù)據(jù)有很多,那天我跟組長提出,我要換一種查詢方法,提升查詢效率。然后組長就問我究竟想怎么換?我就直接同時運行了兩套代碼干同樣的事兒給他看,結(jié)果,就很so easy的換成了我想換的那種方式,我想說的話,全都在代碼里。后來弄完了,閑下來,我解釋了一下不同點,關(guān)鍵點。
2,因為強調(diào)代碼規(guī)范和效率嘛。我就在自己私下寫代碼的時候,旁邊就放著一本代碼整潔之道,還有阿里代碼規(guī)范手冊,然后還有我閑下來的時候,去官網(wǎng)找的一些常用數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型的應(yīng)用對比。我是一邊寫,一邊看。有不知道怎么寫的,就干脆先看一眼,照著書寫。剛開始挺痛苦的,因為寫一句就錯一句,也不能說錯,就是不夠優(yōu)美。但是,感覺現(xiàn)在慢慢變得好了特別特別多。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java利用Apache commons codec進行MD5加密,BASE64加密解密,執(zhí)行系統(tǒng)命令
這篇文章主要介紹了java利用apache Commons包進行MD5加密,BASE64加密解密與執(zhí)行系統(tǒng)命令希望對大家有用2017-12-12Java?ServletContext與ServletConfig接口使用教程
ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個Web應(yīng)用里面可以有多個servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了2022-09-09SpringBoot如何實現(xiàn)持久化登錄狀態(tài)獲取
這篇文章主要介紹了SpringBoot 如何實現(xiàn)持久化登錄狀態(tài)獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Spring?BeanDefinition父子關(guān)系示例解析
這篇文章主要為大家介紹了Spring?BeanDefinition父子關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java多線程Queue、BlockingQueue和使用BlockingQueue實現(xiàn)生產(chǎn)消費者模型方法解析
這篇文章主要介紹了Java多線程Queue、BlockingQueue和使用BlockingQueue實現(xiàn)生產(chǎn)消費者模型方法解析,涉及queue,BlockingQueue等有關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以參考。2017-11-11Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決
這篇文章主要為大家介紹了Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11