激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于params、@PathVariabl和@RequestParam的用法與區別說明

基于params、@PathVariabl和@RequestParam的用法與區別說明

2021-11-15 10:56流煙默 Java教程

這篇文章主要介紹了方法參數相關屬性params、@PathVariabl和@RequestParam用法與區別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

方法參數相關屬性params、@PathVariabl和@RequestParam的使用

【1】params

params:指定request中必須包含某些參數值是,才讓該方法處理。

    @RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10" })
    public String testParamsAndHeaders() {
        System.out.println("testParamsAndHeaders");
        return SUCCESS;
    }

params 只是判斷url 或者 form data 中的參數是否復合params的定義,并不會直接綁定數據到方法的參數中!

【2】@PathVariabl

綁定路徑中的占位符參數到方法參數變量中;只能綁定路徑中的占位符參數,且路徑中必須有參數。

無論是 GET 或者POST 只要 URL中有參數即可!

實例如下:

  • GET
Request URL:http://localhost:8080/SpringMVC-1/springmvc/testPathVariable/1
  • POST
<form action="springmvc/testPathVariable/1" method="POST">
<input type="text" name="username" value=""/>
<input type="text" name="age" value=""/>
<input type="text" name="sex" value=""/>
<input type="submit" value="submit"/>
</form>

【注意】如果URL中無參數,將會出錯;如果URL有參數,但是沒有使用@PathVariabl該注解,那么URL的參數不會默認與方法參數綁定!方法里的參數會默認綁定表單里面對應的參數!

后臺code

如果參數名與占位符一致,則可直接使用@PathVariable;如果不一致,則在@PathVariable( )括號內綁定占位符。

 @RequestMapping("/testPathVariable/{id}")
 public String testPathVariable(@PathVariable("id") Integer id2) {
  System.out.println("testPathVariable: " + id2);
  return SUCCESS;
 }

【3】@RequestParam

該注解相關屬性如下:

  • value:參數key,可以不寫,默認為"";
  • name:和value作用一樣;
  • required:默認值為true,可以不寫;
  • 獲取URL或者 form data 中的參數

基于params、@PathVariabl和@RequestParam的用法與區別說明

前臺請求實例如下:

  • GET
<a href="springmvc/testRequestParam?userName=tom&age=11&sex=boy" rel="external nofollow" >
  • POST
<form action="springmvc/testRequestParam" method="POST">
<input type="text" name="userName" value=""/>
<input type="text" name="age" value=""/>
<input type="text" name="sex" value=""/>
<input type="submit" value="submit"/>
</form>

注意 :

GET中的參數形式為:username=tom&age=11&sex=boy

POST中的參數形式為:以鍵值對形式保存在form data

基于params、@PathVariabl和@RequestParam的用法與區別說明

后臺代碼示例:

	@RequestMapping(value="/regist",produces="application/json;charset=utf-8")
	@ResponseBody
	public String regist(SysUser sysUser , @RequestParam(required=true,name="sex") String sex){
		String userName = sysUser.getUserName();
		String age = sysUser.getAge();
		//...
		return "regist success";
	}

總得來說,均是鍵值對形式,與@PathVariabl中的占位符形式不同!!!

在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,因為強調代碼規范和效率嘛。我就在自己私下寫代碼的時候,旁邊就放著一本代碼整潔之道,還有阿里代碼規范手冊,然后還有我閑下來的時候,去官網找的一些常用數據結構、數據類型的應用對比。我是一邊寫,一邊看。有不知道怎么寫的,就干脆先看一眼,照著書寫。剛開始挺痛苦的,因為寫一句就錯一句,也不能說錯,就是不夠優美。但是,感覺現在慢慢變得好了特別特別多。

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/j080624/article/details/56280382

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 在线a毛片免费视频观看 | 亚洲精品久久久久久下一站 | 欧美一级毛片免费观看视频 | 无码专区aaaaaa免费视频 | 黄色片免费看网站 | 国产1区2| 主播粉嫩国产在线精品 | 日韩中文字幕三区 | 国产精品视频一区二区三区四 | 91国在线高清视频 | 蜜桃视频网站在线观看 | 久久久久中精品中文字幕19 | 成人在线视频免费 | 欧产日产国产精品乱噜噜 | 三级国产网站 | 日日碰日日操 | 海角在线观看91一区二区 | 欧美男人天堂网 | 亚洲第一激情网 | 欧美日韩在线视频一区 | 国产在线a| 欧美精品色精品一区二区三区 | 久久国产乱子伦精品 | 国产精品区一区二区三区 | 久久精品欧美一区二区 | 午夜生活理论片 | 91 在线观看 | 538任你躁在线精品视频网站 | 高清做爰免费无遮网站挡 | 欧美不卡三区 | 久综合 | 午夜精品久久久久久毛片 | 亚洲男人一区 | 免费观看视频网站 | 国产一区成人 | 欧美视频一二区 | 亚洲一区二区中文 | 羞羞羞羞视频 | 午夜精品久久久久久久久久久久久蜜桃 | 欧美一级高潮片免费的 | 在线亚洲播放 |