国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - Java教程 - 使用Spring處理x-www-form-urlencoded方式

使用Spring處理x-www-form-urlencoded方式

2022-03-09 00:42zpzkitt Java教程

這篇文章主要介紹了使用Spring處理x-www-form-urlencoded方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring處理x-www-form-urlencoded方式

最近在重寫一個項目時遇到了許多奇葩問題,這個項目是一個簡單的web后臺項目,基本上全都是增刪改查數據庫的操作。這里面遇到幾個用spring接收前端post請求的接口。

基本情況是post請求有四種data參數格式,這些基礎知識在我另一片博文中提到過這里就不廢話了。主要是因為前端有兩個地方用到了這個接口,但是在用這個接口的時候兩個地方用法都不同,奇葩的c++居然還都解析成功了(其實因為c++沒有對請求參數格式和數據做檢查所以一直沒有問題)。

一個地方是發送的是application/json格式,發送了一個jsonArray數據(數據例子["abc", "bcd"])這個是沒有問題的正確使用方式。(下面簡稱前者)

另一個地方是發送的application/x-www-form-urlencode格式,發送的也是一個jsonArray數據。(下面簡稱后者)

前者解析方式比較簡單

?
1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/check_apps_version",
     method = RequestMethod.POST,
     produces = {"application/json;charset=UTF-8"},
     consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
 @ResponseBody
 public BaseResponse<List<AppListItem>> checkAppsVersion(ReqCheckAppsVersion requstParam,
     @RequestBody List<String> apps) {
   return new BaseResponse<>();
 }

后者這個發送方式在spring用@RequestBody解析時就很怪異,但是前段是手機APP已經發布出去了沒法修改,只能后端來修改滿足這個奇怪的需求

通過調試發現后者前端的接口傳過來的參數是"["abc","def"]="這樣子的,本身x-www-form-urlencode是多個kev-value對的數據格式,所以現在沒有value只有key了,只能通過字符串處理來解決了。

?
1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/check_apps_version",
     method = RequestMethod.POST,
     produces = {"application/json;charset=UTF-8"},
     consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 @ResponseBody
 public BaseResponse<List<AppListItem>> checkAppsVersionParams(HttpServletRequest request,
                                                               ReqCheckAppsVersion requstParam,
                                                               @RequestBody String apps) {
String body = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
   return BaseResponse.success();
 }

兩種方式,一種是通過@RequestBody把post data解析成string格式,另一種是通過HttpServletRequest解析出整個原始post data。然后做字符串處理。

但是在做做這個測試時候我們想了一下會不會有只有value沒有key的情況,也就是這樣"=["abc","def"]"。

測試結果是用tomcat沒法從HttpServletRequest到這個post data,但是用jetty可以從HttpServletRequest解析到post data。

這個可能是tomcat和jetty的區別吧,還沒有弄清楚什么原因。但是我們的問題總算是解決了,最大感觸就是前人挖坑后人埋啊。

希望以后能注意一下代碼健壯性的問題,避免給別人或者自己挖坑。

關于application/x-www-form-urlencoded編碼

同事遇到在servlet端通過request對象getInputStream讀取POST過來的數據,卻讀不到的問題,懷疑是tomcat的問題。查了一下Content-type是application/x-www-form-urlencoded,估計是被解析成了parameters,果然在他獲取流之前,有過request.getParameter的操作。

熟悉servlet的話,這個問題應該算常識了。它其實跟容器無關,所有的servlet容器都是這樣的行為。幾年前在實現一個網關代理的時候就遇到過這個問題,當時使用的是jetty,發現POST過來的數據讀不到,也是application/x-www-form-urlencoded編碼,斷點跟蹤發現是在獲取流之前有過request.getParameter,數據會被解析,并且后續數據流不可再被讀取。

在servlet規范3.1.1節里,對POST數據何時會被當做parameters有描述:

1. The request is an HTTP or HTTPS request.
2. The HTTP method is POST.
3. The content type is application/x-www-form-urlencoded.
4. The servlet has made an initial call of any of the getParameter family of methods on the request object.

If the conditions are met, post form data will no longer be available for reading directly from the request object's input stream.

規范里已經明確的聲明當請求滿足:

1) http/https

2) POST

3) Content-type 是application/x-www-form-urlencoded

4) 調用過getParameter方法,則數據會被當做請求的paramaters,而不能再通過 request 的 inputstream 直接讀取。

所以不論tomcat、jetty還是其他servlet容器都遵循這個方式。不過話說回來,為什么application/x-www-form-urlencoded編碼的數據會被當做parameter來解析呢?

使用http上傳數據可以用GET或POST,使用GET的話,只能通過uri的queryString形式,這會遇到長度的問題,各個瀏覽器或server可能對長度支持的不同,所以到要提交的數據如果太長并不適合使用GET提交。

采用POST的話,既可以在uri中帶有queryString也可以將數據放在body中。body內容可以有多種編碼形式,其中application/x-www-form-urlencoded編碼其實是基于uri的percent-encoding編碼的,所以采用application/x-www-form-urlencoded的POST數據和queryString只是形式不同,本質都是傳遞參數。

在tomcat的Request.parseParameters方法里,對于application/x-www-form-urlencoded是有做判斷的,對這種編碼會去解析body里的數據,填充到parameters里,所以后續想再通過流的方式讀取body是讀不到的(除非你沒有觸發過getParameter相關的方法)。

在HTML4之前,表單數據的編碼方式只有application/x-www-form-urlencoded這一種(現在默認也是這種方式),因為早期的時候,web上提交過來的數據也是非常簡單的,基本上以key-value形式為主,所以表單采用application/x-www-form-urlencoded這種編碼形式也沒什么問題。

在HTML4里又引入了multipart/form-data編碼,對于這兩種編碼如何選擇,請參考這里

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

原文鏈接:https://blog.csdn.net/zpzkitt/article/details/79217811

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久久久 | 91视频在线免费观看 | 国产美女精品人人做人人爽 | 日本一本视频 | 久久九九国产精品 | 亚洲精品乱码久久久久久金桔影视 | 黄色av影视| 中文字幕 亚洲一区 | 亚洲一级毛片 | 欧美成人免费在线 | 国产日产久久高清欧美一区 | 午夜激情视频在线观看 | www.777色| 欧洲亚洲精品久久久久 | 亚洲人视频在线 | 国产亚洲精 | 精品第一区 | 激情五月综合网 | 国产高清久久久 | 欧美一级片在线观看 | 一区二区三区无码高清视频 | 激情欧美一区二区三区中文字幕 | 精品在线播放 | 日韩中文字幕在线 | 精品国产一区二区三区免费 | 日韩欧美成人一区二区三区 | 午夜剧场在线免费观看 | 国产精品久久免费观看spa | 福利资源在线观看 | 黄网站涩免费蜜桃网站 | 色偷偷噜噜噜亚洲男人的天堂 | 久久国产精品亚洲 | 在线免费观看日韩视频 | 久久精品成人一区二区三区蜜臀 | 中文字幕综合 | 51国产午夜精品免费视频 | 97久久精品人人做人人爽50路 | 91精品中文字幕一区二区三区 | av在线日韩| 日韩和欧美的一区二区 | 久久不射电影网 |