[整理]详记被忽略的Get与Post
[事發]
使用了近5年的項目,來了一個最最基本的bug
畫面輸入+號,跳轉至后畫面,+號變成了空格!
[原因]
畫面使用url(get)方法傳參數,并且沒有進行url轉碼!
恐怖的是,幾乎所有頁面都是如此...
[解決辦法]
1.建立假的form,使用post傳參
2.對于彈窗頁面,只能通過showModalDialog的參數vArguments,將參數傳給中間跳板畫面,再由跳板畫面通過window.dialogArguments獲取參數,制造假的form,再post給目標頁面
[延伸]
由此對get與post做了一個較為深入的理解
【正題】
1.GET
通過url進行參數傳遞,顯示于瀏覽器的地址欄中,可以讓用戶看清當前的頁面層次[有時還還有日期,類別等含義],但是長度有限制,不可以超過某個長度[至于多長,似乎瀏覽器還各不相同,總之不能太長了]
[跳轉流程](以java servlet為例)
js或按鈕設定跳轉頁面路徑url[需要代碼內進行url編碼],瀏覽器直接發送請求至服務器[瀏覽器不對url做任何處理],請求到servlet后,默認對url進行url解碼操作。[其中還會有字符編碼解碼問題,瀏覽器會根據頁面charset進行中文或其他語言文字的編碼,服務器端也需要進行相應的字符解碼]
2.POST
通過表單,將表單內各個空間的內容,通過submit方式,發送給url指定的服務器[對于文件等,需要設定表單為:enctype="multipart/form-data"]
[跳轉流程](以java servlet為例)
js或按鈕進行form的submit操作,瀏覽器發送請求至服務器[瀏覽器會自動對表單內內容進行url以及字符編碼],請求到servlet后,默認對url進行url解碼操作。
[與get不同在于,瀏覽器是否進行url編碼操作]
3.Ajax
也有get和post兩種請求類型
【get/post本質區別】
GET將表單中數據的按照variable=value的形式,添加到action所指向的URL后面,并且兩者使用“?”連接,而各個變量之間使用“&”連接;POST是將表單中的數據放在form的數據體中,按照變量和值相對應的方式,傳遞到action所指向URL。
【url編碼解碼的js函數】
escape,encodeURI,encodeURIComponent
escape不編碼字符有69個:
*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不編碼字符有82個:
!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不編碼字符有71個:
!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
解碼函數:
unescape,decodeURI,decodeURIComponent
【何時適用get/post】
http://blog.sina.com.cn/s/blog_78edbfd801012il4.html
1.GET能隨在URL之后的請求參數長度是有限的,過長的請求參數,或像文件上傳這類的大量數據,就不適合用GET請求,而應該改用POST。
2.GET的請求參數會出現在地址欄上,敏感性或保密性的請求參數(例如信用卡號碼、用戶名、密碼等),就不應該使用GET請求來發送。
3.POST請求的請求參數不會出現在地址欄上,所以無法添加到瀏覽器的書簽之中,如果有些頁面是根據請求參數進行不同的頁面顯示(例如論壇的文章發表),而你應該希望可以讓用戶設置書簽,以使日后可以直接點擊書簽進行瀏覽,則此時應該使用GET。
4.有些瀏覽器會根據地址欄緩存數據,如果地址欄是相同的URL,則會直接從瀏覽器緩存中取出數據,而不會真正發送請求而服務器上查詢最新的數據,如果不希望服務器狀態改變,而瀏覽器仍從緩存中取得舊數據,則可以改用POST(使用GET基本上也有方法避免緩存,例如在地址欄上附加時間戳記,讓每次GET請求的地址欄都不相同)。
5.GET是不安全的,因為在傳輸過程,數據被放在請求的URL中,而如今現有的很多服務器、代理服務器或者用戶代理都會將請求URL記錄到日志文件中,然后放在某個地方,這樣就可能會有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的
[其實post也不安全,代理服務器可以輕而易舉的獲取數據]
轉載于:https://www.cnblogs.com/wangxinsheng/p/4367966.html
總結
以上是生活随笔為你收集整理的[整理]详记被忽略的Get与Post的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPerf3 局域网性能测试路由器
- 下一篇: 大数据项目实训总结_最详细大数据项目落地