亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Servlet獲取AJAX POST請求中參數以form data和request payload形式傳輸的方法

2024-07-13 10:13:41
字體:
來源:轉載
供稿:網友

本文實例講述了Servlet獲取AJAX POST請求中參數以form data和request payload形式傳輸的方法。分享給大家供大家參考,具體如下:

HTTP請求中,如果是get請求,那么表單參數以name=value&name1=value1的形式附到url的后面,如果是post請求,那么表單參數是在請求體中,也是以name=value&name1=value1的形式在請求體中。通過chrome的開發者工具可以看到如下(這里是可讀的形式,不是真正的HTTP請求協議的請求格式):

get請求:

RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=streetRequest Method:GETStatus Code:200 OKRequest HeadersAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8,en;q=0.6AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2Connection:keep-aliveCookie:JSESSIONID=74AC93F9F572980B6FC10474CD8EDD8DHost:127.0.0.1:8080Referer:http://127.0.0.1:8080/test/index.jspUser-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36Query String Parametersname:mikanaddress:streetResponse HeadersContent-Length:2Date:Sun, 11 May 2014 10:42:38 GMTServer:Apache-Coyote/1.1

Post請求:

RequestURL:http://127.0.0.1:8080/test/test.doRequest Method:POSTStatus Code:200 OKRequest HeadersAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8,en;q=0.6AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2Cache-Control:max-age=0Connection:keep-aliveContent-Length:25Content-Type:application/x-www-form-urlencodedCookie:JSESSIONID=74AC93F9F572980B6FC10474CD8EDD8DHost:127.0.0.1:8080Origin:http://127.0.0.1:8080Referer:http://127.0.0.1:8080/test/index.jspUser-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36Form Dataname:mikanaddress:streetResponse HeadersContent-Length:2Date:Sun, 11 May 2014 11:05:33 GMTServer:Apache-Coyote/1.1

這里要注意post請求的Content-Type為application/x-www-form-urlencoded,參數是在請求體中,即上面請求中的Form Data。

在servlet中,可以通過request.getParameter(name)的形式來獲取表單參數。

而如果使用原生AJAX POST請求的話:

function getXMLHttpRequest() {     var xhr;     if(window.ActiveXObject) {          xhr= new ActiveXObject("Microsoft.XMLHTTP");     }else if (window.XMLHttpRequest) {          xhr= new XMLHttpRequest();     }else {          xhr= null;     }     return xhr;}function save() {     var xhr = getXMLHttpRequest();     xhr.open("post","http://127.0.0.1:8080/test/test.do");     var data = "name=mikan&address=street...";     xhr.send(data);     xhr.onreadystatechange= function() {          if(xhr.readyState == 4 && xhr.status == 200) {              alert("returned:"+ xhr.responseText);          }     };}

通過chrome的開發者工具看到請求頭如下:

RequestURL:http://127.0.0.1:8080/test/test.doRequest Method:POSTStatus Code:200 OKRequest HeadersAccept:*/*Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8,en;q=0.6AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2Connection:keep-aliveContent-Length:28Content-Type:text/plain;charset=UTF-8Cookie:JSESSIONID=C40C7823648E952E7C6F7D2E687A0A89Host:127.0.0.1:8080Origin:http://127.0.0.1:8080Referer:http://127.0.0.1:8080/test/index.jspUser-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36Request Payloadname=mikan&address=streetResponse HeadersContent-Length:2Date:Sun, 11 May 2014 11:49:23 GMTServer:Apache-Coyote/1.1

注意請求的Content-Type為text/plain;charset=UTF-8,而請求表單參數在RequestPayload中。

那么servlet中通過request.getParameter(name)卻是空。為什么呢?而這樣的參數又該怎么樣獲取呢?

為了搞明白這個問題,查了些資料,也看了Tomcat7.0.53關于請求參數處理的源碼,終于搞明白了是怎么回事。

HTTP POST表單請求提交時,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST請求如果不指定請求頭RequestHeader,默認使用的Content-Type是text/plain;charset=UTF-8。

由于Tomcat對于Content-Type multipart/form-data(文件上傳)和application/x-www-form-urlencoded(POST請求)做了“特殊處理”。下面來看看相關的處理代碼。

Tomcat的HttpServletRequest類的實現類為org.apache.catalina.connector.Request(實際上是org.apache.coyote.Request),而它對處理請求參數的方法為protected void parseParameters(),這個方法中對Content-Type multipart/form-data(文件上傳)和application/x-www-form-urlencoded(POST請求)的處理代碼如下:

protectedvoid parseParameters() {      //省略部分代碼......      parameters.handleQueryParameters();// 這里是處理url中的參數      //省略部分代碼......      if ("multipart/form-data".equals(contentType)) { // 這里是處理文件上傳請求        parseParts();        success = true;        return;      }      if(!("application/x-www-form-urlencoded".equals(contentType))) {// 這里如果是非POST請求直接返回,不再進行處理        success = true;        return;      }      //下面的代碼才是處理POST請求參數      //省略部分代碼......      try {        if (readPostBody(formData, len)!= len) { // 讀取請求體數據          return;        }      } catch (IOException e) {        // Client disconnect        if(context.getLogger().isDebugEnabled()) {          context.getLogger().debug(              sm.getString("coyoteRequest.parseParameters"),e);        }        return;      }      parameters.processParameters(formData, 0, len); // 處理POST請求參數,把它放到requestparameter map中(即request.getParameterMap獲取到的Map,request.getParameter(name)也是從這個Map中獲取的)      // 省略部分代碼......}protected int readPostBody(byte body[], int len)    throws IOException {    int offset = 0;    do {      int inputLen = getStream().read(body, offset, len - offset);      if (inputLen <= 0) {        return offset;      }      offset += inputLen;    } while ((len - offset) > 0);    return len;}

從上面代碼可以看出,Content-Type不是application/x-www-form-urlencoded的POST請求是不會讀取請求體數據和進行相應的參數處理的,即不會解析表單數據來放到request parameter map中。所以通過request.getParameter(name)是獲取不到的。

那么這樣提交的參數我們該怎么獲取呢?

當然是使用最原始的方式,讀取輸入流來獲取了,如下所示:

privateString getRequestPayload(HttpServletRequest req) {     StringBuildersb = new StringBuilder();     try(BufferedReaderreader = req.getReader();) {          char[]buff = new char[1024];          intlen;          while((len = reader.read(buff)) != -1) {              sb.append(buff,0, len);          }     }catch (IOException e) {          e.printStackTrace();     }     returnsb.toString();}

當然,設置了application/x-www-form-urlencoded的POST請求也可以通過這種方式來獲取。

所以,在使用原生AJAX POST請求時,需要明確設置Request Header,即:

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

另外,如果使用jquery,我使用1.11.0這個版本來測試,$.ajax post請求是不需要明確設置這個請求頭的,其他版本的本人沒有親自測試過。相信在1.11.0之后的版本也是不需要設置的。不過之前有的就不一定了。這個沒有測試過。

后記:

最近在看書時才真正搞明白,服務器為什么會對表單提交和文件上傳做特殊處理,因為表單提交數據是名值對的方式,且Content-Type為application/x-www-form-urlencoded,而文件上傳服務器需要特殊處理,普通的post請求(Content-Type不是application/x-www-form-urlencoded)數據格式不固定,不一定是名值對的方式,所以服務器無法知道具體的處理方式,所以只能通過獲取原始數據流的方式來進行解析。

jquery在執行post請求時,會設置Content-Type為application/x-www-form-urlencoded,所以服務器能夠正確解析,而使用原生ajax請求時,如果不顯示的設置Content-Type,那么默認是text/plain,這時服務器就不知道怎么解析數據了,所以才只能通過獲取原始數據流的方式來進行解析請求數據。

 

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产福利国产秒拍| 国产成人+综合亚洲+天堂| 色爱av美腿丝袜综合粉嫩av| 欧美另类在线观看| 日韩精品视频观看| 91免费精品国偷自产在线| 日韩国产精品亚洲а∨天堂免| 精品久久久久久中文字幕一区奶水| 国产成人精品日本亚洲| 日韩亚洲欧美中文在线| 福利微拍一区二区| 日韩欧美极品在线观看| 国产成人久久久| 亚洲人成网站免费播放| 国产日韩在线视频| 亚洲xxxxx性| 亚洲香蕉av在线一区二区三区| 欧美日韩亚洲激情| 国产日产久久高清欧美一区| 国产精品扒开腿做| 亚洲国产精品久久久久秋霞蜜臀| 国产精品爱啪在线线免费观看| 亚洲美女免费精品视频在线观看| 亚洲午夜精品久久久久久性色| 国产高清视频一区三区| 精品呦交小u女在线| 亚洲黄在线观看| 日韩电视剧在线观看免费网站| 2018中文字幕一区二区三区| 欧美性videos高清精品| 欧美激情aaaa| 国产精品你懂得| 成人av.网址在线网站| 久久久国产精彩视频美女艺术照福利| 日韩av日韩在线观看| 亚洲一区美女视频在线观看免费| 欧美综合国产精品久久丁香| 69久久夜色精品国产69乱青草| 中文字幕欧美日韩| 亚洲一区二区精品| 久久视频在线免费观看| 久久九九精品99国产精品| 日韩精品极品毛片系列视频| 亚洲精品自在久久| 国产精品第一页在线| 亚洲激情视频网站| 欧美色图在线视频| 国自产精品手机在线观看视频| 欧美美女操人视频| 韩国国内大量揄拍精品视频| 国产精品视频99| 亚洲韩国欧洲国产日产av| 欧美天堂在线观看| 91精品中文在线| 久久视频这里只有精品| 91免费看片网站| 91国内产香蕉| 国产三级精品网站| 中文亚洲视频在线| 欧美在线www| 国产不卡av在线免费观看| 精品亚洲一区二区三区四区五区| 国产成人精品视频在线观看| 欧美精品在线网站| 久久精品国产免费观看| 久久久久久国产精品美女| 中文字幕一区电影| 久久久久免费精品国产| 国产精品第七十二页| 国产日韩中文字幕在线| 国产精品日韩在线| 一本一本久久a久久精品牛牛影视| 欧美亚洲另类视频| 精品久久久久久| 国产欧美精品在线播放| 欧美日韩国产成人在线| 亚洲japanese制服美女| 成人黄色影片在线| 国产一区玩具在线观看| 国产精品成人免费视频| 国产欧美日韩专区发布| 国产精品欧美一区二区三区奶水| 欧美性猛交xxxx| 国产精品igao视频| 亚洲国产中文字幕久久网| 亚洲天堂色网站| 亚洲一区二区三区成人在线视频精品| 欧美在线影院在线视频| 国产精品pans私拍| 一区二区三区亚洲| 91免费在线视频网站| 97免费视频在线播放| 欧美午夜精品伦理| 欧美一级淫片丝袜脚交| 欧美一级淫片播放口| 成人免费淫片视频软件| 日韩精品亚洲视频| 国产精品入口福利| 成人黄色生活片| 日韩欧美国产黄色| 91视频九色网站| 精品国产一区二区在线| 午夜精品视频网站| 国产精品91在线| 亚洲精品色婷婷福利天堂| 欧美黑人视频一区| 欧美精品xxx| 精品国产一区二区三区久久久| 欧美天天综合色影久久精品| 日韩免费在线播放| 一夜七次郎国产精品亚洲| 欧美日韩人人澡狠狠躁视频| 亚洲精品美女免费| 欧美日韩中文字幕综合视频| 国产亚洲综合久久| 国产一区二区三区久久精品| 亚洲色图18p| 中文字幕成人精品久久不卡| 懂色aⅴ精品一区二区三区蜜月| 国产精品久久久久9999| 亚洲成年网站在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 成人免费淫片视频软件| 永久555www成人免费| 中文字幕av一区二区三区谷原希美| 国产欧美va欧美va香蕉在| 国产在线精品自拍| 日本一区二区在线免费播放| 久久婷婷国产麻豆91天堂| 亚洲国产精品va在线观看黑人| 亚洲第一色在线| 日韩精品在线视频美女| 亚洲国产精品电影在线观看| 精品中文字幕在线观看| 日韩欧美在线播放| 精品夜色国产国偷在线| 日韩欧美在线免费| 一区二区福利视频| 日本高清视频精品| 久久久久北条麻妃免费看| 亚洲香蕉伊综合在人在线视看| 久久久免费精品视频| 国产在线视频欧美| 国产在线观看精品一区二区三区| 亚洲一区亚洲二区| 91黑丝高跟在线| 亚洲第一黄色网| 国模私拍视频一区| 8090理伦午夜在线电影| 91国产精品91| 欧美日韩在线看| 欧美寡妇偷汉性猛交| 色综合久久精品亚洲国产| 91九色国产社区在线观看| 国内精品久久久久影院 日本资源| 国产97在线|亚洲| 亚洲欧美激情一区| 日韩av在线免费播放| 国产极品jizzhd欧美| 亚洲国产另类久久精品| 最近2019中文字幕在线高清| 久久久精品视频在线观看| 日韩精品中文字幕在线| 欧美国产日韩免费|