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

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

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

服務器之家 - 編程語言 - Java教程 - Servlet獲取AJAX POST請求中參數以form data和request payload形式傳輸的方法

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

2021-02-21 11:10MikanMu Java教程

這篇文章主要介紹了Servlet獲取AJAX POST請求中參數以form data和request payload形式傳輸的方法,結合實例形式詳細分析了post數據發送及獲取請求數據的原理與相關操作注意事項,需要的朋友可以參考下

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

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

get請求:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
RequestURL:http://127.0.0.1:8080/test/test.do?name=mikan&address=street
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Connection:keep-alive
Cookie:JSESSIONID=74AC93F9F572980B6FC10474CD8EDD8D
Host:127.0.0.1:8080
Referer:http://127.0.0.1:8080/test/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
Query String Parameters
name:mikan
address:street
Response Headers
Content-Length:2
Date:Sun, 11 May 2014 10:42:38 GMT
Server:Apache-Coyote/1.1

Post請求:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
RequestURL:http://127.0.0.1:8080/test/test.do
Request Method:POST
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:25
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=74AC93F9F572980B6FC10474CD8EDD8D
Host:127.0.0.1:8080
Origin:http://127.0.0.1:8080
Referer:http://127.0.0.1:8080/test/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
Form Data
name:mikan
address:street
Response Headers
Content-Length:2
Date:Sun, 11 May 2014 11:05:33 GMT
Server:Apache-Coyote/1.1

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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的開發者工具看到請求頭如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RequestURL:http://127.0.0.1:8080/test/test.do
Request Method:POST
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Connection:keep-alive
Content-Length:28
Content-Type:text/plain;charset=UTF-8
Cookie:JSESSIONID=C40C7823648E952E7C6F7D2E687A0A89
Host:127.0.0.1:8080
Origin:http://127.0.0.1:8080
Referer:http://127.0.0.1:8080/test/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36
Request Payload
name=mikan&address=street
Response Headers
Content-Length:2
Date:Sun, 11 May 2014 11:49:23 GMT
Server: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請求)的處理代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)是獲取不到的。

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,即:

?
1
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程序設計有所幫助。

原文鏈接:http://blog.csdn.net/mhmyqn/article/details/25561535/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美一区亚洲二区 | 国产精品18久久久久vr手机版特色 | av网站有哪些 | 在线看国产 | 亚洲欧美一级久久精品国产特黄 | 精品国产乱码久久久久夜 | 精品无码久久久久国产 | 日韩欧美一区二区三 | 综合久久网 | 日韩精品一区二区三区中文字幕 | 一级毛毛片 | 午夜视频| 国产精品99久久久久久久vr | 91精品国产91久久久久久吃药 | 国产日韩欧美在线 | 91视频网页版 | 综合五月| 国产伦精品一区二区三区四区视频_ | 久久永久视频 | 国产精品视屏 | 国产精品免费观看 | 中文字幕一区三级久久日本 | 中文在线播放 | 亚洲精品国产第一综合99久久 | 天天干天天草 | 亚洲一区二区美女 | 精精国产xxxx视频在线播放7 | 色综网 | 亚洲精品日本 | 日韩av手机版| 毛片免费观看网址 | 91亚洲精品一区 | 福利国产| 久久久久久亚洲精品 | 成人在线小视频 | 亚洲成av人片在线观看无码 | 国产日韩欧美在线 | www.44181com| 亚洲欧美国产另类 | 99中文字幕 | 成年人免费观看网站 |