1. 程式人生 > >在springmvc中使用@PathVariable時,應該注意點什麼?

在springmvc中使用@PathVariable時,應該注意點什麼?

導讀:近來在做庫存調劑系統時,我從前臺到後臺的傳值方式,主要包括:1個,用@PathVariable或者@RequestParam從路徑取;大於一個,用於更新或者新增操作的,我用的是表單實體傳到後臺;大於一個,用於查詢的,我用的@RequestBody(好吧,我承認這個只是我覺得好玩,但沒有多少人願意在後臺一行又一行的寫:String test=request.getParameter("test");吧?????)

現在,主要就是想說一個從路徑取值的“坑”,而重中之重,就想說一下我更偏愛的@PathVariable(別問我為什麼,/{param}/fn.do,簡單啊)

一、使用@PathVariable的轉變過程

首先:

在盤古開天闢地時,就是一切還很混沌時,姑娘我連用@PathVariable取值都沒有取過來,還蒙圈蒙了一小會兒,完全不明白髮生了什麼,因為我看著我的語法和格式,哪兒哪兒都對,但就是沒有傳過來值。我一想我原來寫/{param}/fn.do這種方式傳值的時候,也沒有問題呀,怎麼今天是見鬼了???? 蒙圈完了之後,就發現端倪了。

請看看我怎麼寫的哈:

@RequestMapping("/dealerStock/swapOrder/{orderID}/cancelAuditThisOrder.do")
public @ResponseBody String cancelAuditThisOrder(@PathVariable("OrderID") String strOrderID)){
...
...
}

然後的然後,我就一直沒有請求到這個方法,更別談什麼有沒有取到值的問題!後來解決的時候,真想一掌拍自己腦門上!

然後:

當代碼規範審查通過後,也經過了測試部的一級功能業務測試以及業務部的二級業務流程測試。文件之類的,都準備好了(我還能再說什麼呢,無聲的兩個呵 呵) 正要布上去生產線的時候,老大再次審查了一遍程式碼,審查到最後也沒個啥結果,但是,突然間看到那個@PathVariable就問了我兩個問題:一,如果我的ID是不連續的,這種方法還能好使嗎?比如說:HC  782981;二,是不是隻要我拿到這個請求路徑,而我隨便推測一個ID號,就能避過使用者操作別人的資料?

姑娘我再次被雷擊倒,無言以對,馬上實際驗證。結果:Yes!  你說第一個的結果是Yes,這個我很滿意,但第二個是Yes,就很想哭了。   測試出結果後,就請命去幹掉這個問題了。

我的第一步嘗試:

新增method=RequestMethod.post,也就是說使用者不能輸入Url地址以get的形式獲取資料,只能通過系統內部請求。   

組長:你自己說,就算咱們改成了Post請求,你能不能訪問到?

姑娘:我能,就自己寫一個按鈕,再用post請求就行了。如果使用者裡面有懂點程式編碼的,輕而易舉就能破掉。我再去改

組長:其實,我們只能防君子,哪個系統都有漏洞,沒有絕對的許可權控制和安全,但咱們儘量的給做好。

我的第二步嘗試:

在第二步嘗試前,我想了一會兒。我發現這個事件有以下幾個突破口:一、像訂單編號這個敏感的資料,能不能做到不被推測出來?二、使用者是根據訪問路徑,然後加上一個ID號去請求,如果使用者拿不到訪問路徑呢?三、要點就是使用者只能操作自己的資料,我可以在敏感操作的時候,同時校驗當前使用者。四、既然都是@PathVariable這種方式帶來的一些問題,那我可以把相應的方法,換掉這種傳值方式。五、使用者看到的是一個請求方法路徑,我可不可以在路徑中加入隨機密碼鹽,進一步的控制關鍵操作的訪問。

好吧,為了方便迅速,我直接把這種傳值方式給改了。當然也沒有改完,時間關係,像一些本來就屬於公開資料的內容,還是沒改。

我的第三步嘗試:

在第二步的時候,就已經改完程式碼了。然後,我覺得我是一個很較真的人。忙裡偷閒,我把我在第二步嘗試中想到了幾個點,都寫程式碼測了測。最先測出來的是第三種(同時檢驗當前使用者,也就簡單類似於where orderID=? and userID=? ) 其次,還測了測那個密碼鹽值,也確實能夠控制住,但是,想了想系統的性質和資源的最終走向,沒改。然後,去禁止使用者開啟開發者工具或者檢視原始碼,然而,這根本不是我能控制住的。我也最多就是能控制住快捷鍵開啟,但人家還有滑鼠啊??????瀏覽器提供的功能,不是我想幹掉就幹掉滴滴滴滴。

我的第一個方案,就是改造訂單生成的方式,然後我覺得吧,這個好像不怎麼靠譜。但毫無疑問比當前的生成方式要靠譜得太多,但這要改動下來,呃,原諒我很慫。

二、個人總結

我最大的問題,不是我後來想不出更為優雅的方案去解決,而是,我從根本上,對這是個問題的問題毫無知覺。我甚至都不覺得那樣有什麼問題,這才是我最該考慮的點。

其實,我用@PathVariable或者什麼別的方式去傳值,這都無可厚非。但我也應該更進一步的考慮到它的應用場景和系統功能鎖涉及到的資料,以及可能帶來的後果。就比如說我這個@PathVariable的問題,在別的查詢一些區域資訊(公共展示資料)的時候,我也這麼用了,組長也看見了,但為什麼他著重說了訂單這一塊,還要求這一塊必須改。反正,我就是欠思考。。。。。。

很多很多的東西,都是建立在日常生活體驗上的。我以前就很崇拜架構師,現在也很崇拜。但是,我突然明白,架構師也不是光有空架子的。就比如說我自己吧,我還算是亂七八糟的想法挺多的那種(雖然並不是每個都靠譜)但是,做事情不能光憑想象,要實際操作的。

感覺最近做得比較好一點的就是:

1,因為有一個地方查詢的資料有很多,那天我跟組長提出,我要換一種查詢方法,提升查詢效率。然後組長就問我究竟想怎麼換?我就直接同時運行了兩套程式碼幹同樣的事兒給他看,結果,就很so easy的換成了我想換的那種方式,我想說的話,全都在程式碼裡。後來弄完了,閒下來,我解釋了一下不同點,關鍵點。

2,因為強調程式碼規範和效率嘛。我就在自己私下寫程式碼的時候,旁邊就放著一本程式碼整潔之道,還有阿里程式碼規範手冊,然後還有我閒下來的時候,去官網找的一些常用資料結構、資料型別的應用對比。我是一邊寫,一邊看。有不知道怎麼寫的,就乾脆先看一眼,照著書寫。剛開始挺痛苦的,因為寫一句就錯一句,也不能說錯,就是不夠優美。但是,感覺現在慢慢變得好了特別特別多。  

所謂經驗,就是經常體驗。多寫程式碼多思考,一定要多寫程式碼,多寫優雅的程式碼。

相關推薦

springmvc使用@PathVariable應該注意什麼?

導讀:近來在做庫存調劑系統時,我從前臺到後臺的傳值方式,主要包括:1個,用@PathVariable或者@RequestParam從路徑取;大於一個,用於更新或者新增操作的,我用的是表單實體傳到後臺;

Qt 學習之路 2(19):事件的接受與忽略(當重寫事件回撥函式時,時刻注意是否需要通過呼叫父類的同名函式來確保原有實現仍能進行!有好幾個例子。為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類的這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就

setlocale(LC_ALL, ""); 取值為空字串" "(注意不是NULL)則locale與本地環境所使用的編碼方式相同(在本地化應該很有用);

在C執行庫提供的多位元組字元-寬字元轉換函式:mbstowcs()/wcstombs()中,需要用到全域性變數locale( locale encoding ),以指定多位元組字元的編碼型別 1. 功能: 用來定義全域性變數:locale(locale encoding) 標頭檔案: setlocal

Android app新增facebook原生廣告應該注意的坑

在app中新增facebook廣告,由於facebook廣告做了快取,為了讓廣告展示次數更高,可以在onDestroy方法中,將廣告物件銷燬,下次再請求廣告重新例項化。 @Override protected void onDestroy() {

WTForms做更新的一些注意

因為做“新增”和“更新”操作時的內容都是類似的,所以可以定義一個FlaskForm類然後在“新增”和“更新”模板中都使用該類進行渲染: MovieForm(FlaskForm): class MovieForm(FlaskForm): tag_list = Tag.query.al

Oracle刪除表資料的時候應該注意的問題 Oracle與MySql他們一些表之間的區別

1. 刪除表的注意事項 在刪除一個表中的全部資料時,須使用TRUNCATE TABLE 表名;因為用DROP TABLE,DELETE * FROM 表名時,TABLESPACE表空間該表的佔用空間並未釋放,反覆幾次DROP,DELETE操作後,該TABLESPACE上百兆的空間就被耗光了。

【Web篇03】Spring框架下servlet響應的res在jsp頁面顯示防止亂碼的操作

首先,在Spring軟體中,找到Web工程,src下的對應的servlet; 在servlet中獲取請求引數之後,給瀏覽器傳送響應之前; 需要鍵入一段程式碼即可,如下: response.setContentType("text/html;charset=UTF-8"); 括號內的

SpringMVC@PathVariable和@RequestParam之間的區別

@PathVariable繫結URI模板變數值 @PathVariable是用來獲得請求url中的動態引數的 @PathVariable用於將請求URL中的模板變數對映到功能處理方法的引數上。//通俗來講配置url和方法的一個關係 @RequestMapping("/item/{item

在網路上使用圖片應當注意什麼?

一圖勝千言,圖片一直是網站資訊、商業宣傳中吸引使用者的重要元素。自媒體時代,網路圖片的低創作門檻隨之帶來了越來越多的侵權問題。我們一般釋出在網站、公眾號或其他對外宣傳資料上的文章都會配有圖片,但是由於釋出的圖片比較多不可能都自主設計、自主拍攝,難免會通過各種渠道“盜圖”,這樣會大大增加我們侵

訂購TVS管必須注意以下幾個引數的選擇

    1.最小擊穿電壓VBR和擊穿電流IR。VBR是TVS管最小的擊穿電壓,在25℃時,低於這個電壓TVS管是不會產生雪崩的。當TVS管流過規定的1mA電流(IR)時,加於TVS管兩極的電壓為其最小擊穿電壓VBR。按TVS管的VBR與標準值的離散程度,可把VBR分為5%和10%兩種。對於5%的V

SpringMVC @PathVariable、@RequestParam、@RequestBody的使用

文章目錄 一、正確理解 訪問請求、URI、URL、請求引數 四者的區別 二、`@PathVariable` 對映 URL 繫結的佔位符 三、`@RequestParam` 獲取request請求引數中的值 四、`@PathVariabl

單元測試靜態方法注意

Mockito 很強大, 但是它不支援靜態方法.所以, 就用Powermock了. 要測試的物件是Controller中的介面, 對單元測試來說, 這個待測試的街口應該是一個白盒的. 所以, 其中的第三方(service,其他靜態類)的呼叫都應該使用mock物件來stub起來. 下面是## 示例程式碼(隨

執行一個MapReduce應該監控些什麼

    執行一個MapReduce時,應該監控些什麼 前言        本文討論的是,在以Yarn做資源管理的叢集上如何監控一個MapReduce程式。 一、概述   &nbs

專案遇到的坑和注意 總結 持續更新

gitHub地址: 傳送門 工作中遇到的坑和思考 有不同意見歡迎指正交流 前排推薦 https://github.com/topics/javascript 關注JS開源框架動態 勤於總結和思考 1. ajax請求的結果要和後端約定好返回的資料格式。

Java包裝類作用及注意

轉載地址: https://blog.csdn.net/liu_005/article/details/79585956 Java中對每種基本型別都有一個對應的包裝類,這裡主要講解包裝類的作用和包裝類使用時的一些注意點。 包裝類的作用 作用主要有以下兩方面:  - 編

19年跳槽的你應該準備什麼呢?

18年就這樣在不知不覺中過去了,給自己一天的休息,想了很多東西,想想這一年付出了什麼、收穫了什麼?有種失落、有點小確幸、有種涼涼的感覺……,像是打翻了五味瓶,各種情愫在內心瀰漫著。     而後,剎那間有種驚醒的感覺。不必等待、何必等待,突然明白“逝者如斯夫不捨晝夜

函式new和delete的注意

來看一個典型的例子 關於指標的一些段錯誤,是因為記憶體釋放的不對,這條例子是符合要求的,因為指標 已經new出,完全可以使用delete將其釋放,在函式中傳入指標的時候,是可以進行記憶體 釋放的。 下一個例子 這個例子就有記憶體洩露的問題了。因為在函式中傳入的時

.net Json 反序列化屬性帶

.net Json 反序列化時,屬性帶點 使用[JsonProperty("xxx.xxx")] static void Main(string[] args) { string json="{\"pager.pageNo\":\"No2\",\"

【本人禿頂程式設計師】只會增刪改查當你有一定的開發經驗應該如何提升自己?

←←←←←←←←←←←← 我都禿頂了,還不點關注! 工作1-5年開發經驗,當你們提出漲工資的時候,或者要offer的時候底氣怎麼樣,是不是底氣十足,不給漲工資就辭職,是不是有自信提出來主管、或者是專案經理都能同意,他們相當設法把你留住。如果這樣你才是成功。什麼技術都沒有何談工資! 給你分

放鞭炮應該戴護目鏡

放鞭炮時,應該戴護目鏡     紅朝儒生 2015-2-19   關鍵字:鞭炮 護目鏡 簡介:國家應該出臺一個規定,強制要求在燃放鞭炮時的人員,都必須佩戴護目鏡。       今天是大年初一,閒著沒事外出轉悠。回來的時候,在公車上看到新聞,說醫院救治被鞭炮炸傷