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

首頁 > 開發 > Java > 正文

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

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

本文實例講述了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
亚洲精品国产精品国产自| 91av网站在线播放| 欧美巨猛xxxx猛交黑人97人| 懂色av影视一区二区三区| 精品网站999www| 欧美电影在线免费观看网站| 不卡毛片在线看| 国产精品最新在线观看| 91精品久久久久久久久久另类| 一道本无吗dⅴd在线播放一区| 亚洲一区二区中文字幕| 川上优av一区二区线观看| 久久久久久欧美| 国产精品久久久久久av福利| 国产女精品视频网站免费| 欧美日韩亚洲91| 亚洲第一区在线| 欧美激情亚洲综合一区| 国产mv久久久| 在线视频欧美日韩精品| 亚洲综合第一页| 一区二区三区www| 欧洲成人在线视频| 欧美性一区二区三区| 亚洲精品一区二区网址| 日本在线精品视频| 亚洲欧洲美洲在线综合| 国产精品福利观看| 亚洲午夜色婷婷在线| 亚洲精品免费网站| 久久久久久美女| 日韩在线小视频| 日韩视频在线观看免费| 26uuu另类亚洲欧美日本老年| 美女av一区二区| 中文字幕久热精品在线视频| 成人在线一区二区| 97涩涩爰在线观看亚洲| 国产精品久久久久久久app| 国产精品欧美久久久| 少妇高潮久久久久久潘金莲| 欧美成人免费视频| 亚洲最大成人在线| 色噜噜久久综合伊人一本| 九色成人免费视频| 亚州欧美日韩中文视频| 日韩网站免费观看高清| 国自产精品手机在线观看视频| 国产精品嫩草视频| 成人av在线天堂| 欧美精品久久久久久久久| 欧美国产日韩xxxxx| 欧美洲成人男女午夜视频| 国产精品福利久久久| 欧美成人全部免费| 在线不卡国产精品| 日韩视频免费中文字幕| 欧美日韩加勒比精品一区| 久久综合网hezyo| 欧美人成在线视频| 欧美日韩国产在线播放| 国产成人久久久精品一区| 国产精品久久久久久久av电影| 性欧美在线看片a免费观看| 狠狠色噜噜狠狠狠狠97| 国产精品一区二区久久精品| 亚洲第一区中文字幕| 亚洲综合在线小说| 国内自拍欧美激情| 91美女片黄在线观| 日韩在线观看免费高清完整版| 亚洲欧美激情精品一区二区| 国产精品电影一区| 欧美激情xxxx| www.亚洲一区| 日韩在线免费高清视频| 一本色道久久88综合日韩精品| 国产成人精品999| 成人亚洲欧美一区二区三区| 国产日韩av高清| 亚洲成色777777女色窝| 国产精品1区2区在线观看| 热久久免费视频精品| 国产精品久久久亚洲| 中文日韩在线视频| 色诱女教师一区二区三区| 国产a∨精品一区二区三区不卡| 欧美性xxxx在线播放| 欧美精品一区三区| 国产精品久久99久久| 国产精品久久久久久一区二区| 欧美乱大交xxxxx另类电影| 国产日韩欧美日韩大片| 国产精国产精品| 亚洲精品国产成人| 国产91精品久| 成人网在线观看| 亚洲国产成人精品电影| 国产精品亚洲自拍| 国产精品扒开腿做爽爽爽视频| 国产成人综合精品| 亚洲高清福利视频| 成人美女av在线直播| 色系列之999| 欧美肥老太性生活视频| 国产精品v片在线观看不卡| 午夜精品福利在线观看| 久久五月情影视| 欧美日韩裸体免费视频| 亚洲激情久久久| 亚洲国产天堂久久国产91| 欧美激情视频网址| 亚洲欧美一区二区精品久久久| 亚洲精品一区二区久| 国色天香2019中文字幕在线观看| 国产男女猛烈无遮挡91| 在线观看国产精品日韩av| 日本精品免费一区二区三区| 亚洲精品一区二区在线| 国外成人在线播放| 欧美精品18videos性欧| 992tv成人免费视频| 国产裸体写真av一区二区| 久热精品视频在线观看一区| 国产日本欧美一区二区三区在线| 欧美激情区在线播放| 久久全球大尺度高清视频| 欧洲成人免费aa| 久久视频中文字幕| 久久亚洲一区二区三区四区五区高| 国产suv精品一区二区三区88区| 国产不卡一区二区在线播放| 97视频在线观看视频免费视频| 成人中心免费视频| 97国产精品人人爽人人做| 国产91色在线播放| 国产精品都在这里| 国产午夜精品一区二区三区| 992tv成人免费影院| 国产精品美女久久久久av超清| 久久久综合免费视频| 欧洲中文字幕国产精品| 在线一区二区日韩| 亚洲自拍欧美色图| 久久琪琪电影院| 欧美一区二区三区图| 91中文在线观看| 日韩a**中文字幕| 日韩在线免费视频| 色爱精品视频一区| 欧美日韩国产丝袜另类| 91在线观看免费高清| 国产欧亚日韩视频| 国产精品第3页| 国产精品电影久久久久电影网| 亚洲国产欧美一区二区三区久久| 日韩黄色av网站| 国产精品盗摄久久久| 国产亚洲一区精品| 一道本无吗dⅴd在线播放一区| 亚洲第一福利视频| 国产精彩精品视频| 欧美一区二区大胆人体摄影专业网站| 亚洲欧美激情四射在线日|