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=street
Request Method:GET
Status Code:200 OKRequest 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.36Query String Parameters
name:mikan
address:streetResponse Headers
Content-Length:2
Date:Sun, 11 May 2014 10:42:38 GMT
Server:Apache-Coyote/1.1

Post请求:

RequestURL:http://127.0.0.1:8080/test/test.do
Request Method:POST
Status Code:200 OKRequest 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.36Form Data
name:mikan
address:streetResponse 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请求的话:

         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.do
Request Method:POST
Status Code:200 OKRequest 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.36Request Payload
name=mikan&address=streetResponse 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请求)的处理代码例如以下:

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 disconnectif(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;}

从上面代码能够看出,POST请求是不会读取请求体数据和进行对应的參数处理的,即把表单数据解析后,放到request parameter map中(即request.getParameterMap获取到的Map,request.getParameter(name)也是从这个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之后的版本号也是不须要设置的。只是之前有的就不一定了。这个没有測试过。

转载于:https://www.cnblogs.com/mfrbuaa/p/3952366.html

AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式相关推荐

  1. 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...

    本文实例讲述了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法.分享给大家供大家参考,具体如下: HTTP请求中,如果是get请求,那么 ...

  2. vue axios POST请求中参数以form data和request payload形式的原因

    HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value& ...

  3. form data和request payload的区别

    2019独角兽企业重金招聘Python工程师标准>>> HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: < ...

  4. http请求中的Query String Parameters、Form Data、Request Payload

    参考: (1).(http请求参数之Query String Parameters.Form Data.Request Payload) - https://www.jianshu.com/p/c81 ...

  5. python爬虫post请求翻页_python爬虫如何POST request payload形式的请求

    python爬虫如何POST request payload形式的请求 1. 背景 最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POS ...

  6. java request payload_前后端联调之Form Data与Request Payload,你真的了解吗?

    前言 做过前后端联调的小伙伴,可能有时会遇到一些问题.例如,我明明传递数据给后端了,后端为什么说没收到呢?这时候可能就会就会有小伙伴陷入迷茫,本文从chrome-dev-tools(F12调试器)中看 ...

  7. Query String Parameters、Form Data、Request Payload的区别

    Query String Parameters 当发起一次GET请求时,参数会以url string的形式进行传递.即?后的字符串则为其请求参数,并以&作为分隔符. 如下http请求报文头: ...

  8. python提交post请求payload webkit_python爬虫实现POST request payload形式的请求

    1. 背景 最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数据格式(Form data).而使用Form data数据的提交方式 ...

  9. python requests form data_Python爬虫:Request Payload和Form Data的简单区别说明

    Request Payload 和 Form Data 请求头上的参数差别在于: Content-Type Form Data Post表单请求 代码示例 headers = { "Cont ...

最新文章

  1. android 虚拟按键挡住布局,Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题...
  2. SWIG,C#沟通C++的桥梁
  3. js---PC端滑动进度条
  4. 分布式应用的未来 — Distributionless
  5. 大三、研二的秋招备战路线(Java、大数据)
  6. Linux 平台下 Tomcat 的安装与优化
  7. 10.企业安全建设入门(基于开源软件打造企业网络安全) --- 数据库安全
  8. ENVI学习总结(十五)——遥感影像分类与应用
  9. Facebook高效工作Tips
  10. WFP 学习(一)——构架把握
  11. windows系统下自定义图标
  12. 子矩阵的和(Python实现)
  13. Nacos 1.1.0发布,支持灰度配置和地址服务器模式
  14. 知之者不如好之者 好之者不如乐之者
  15. UE4-灯光烘焙效果质量不佳解决方法
  16. html base64 img 图片显示
  17. C++学校图书馆管理系统
  18. Android 音视频开发(一):PCM 格式音频的播放与采集
  19. 路由器RIP动态路由配置——思科模拟器学习
  20. SpringDataJpa框架使用【超详细!】

热门文章

  1. win10 看计算机配置要求,win10怎么看电脑配置
  2. java单链表基本操作 一,Java_实现单链表-基本操作
  3. 以下构成python循环结构的方法中正确的是_python教程:python循环结构
  4. 接口规范 8. 播出认证相关接口
  5. 接口规范 6. 查看在线用户
  6. 编程利器 Beyond Compare 的使用
  7. STM8学习笔记---利用UID码实现开机产生随机数
  8. 【转】QT中窗口刷新事件的学习总结
  9. vs2008上QT中增加智能提示功能
  10. 毕设日志——Faster RCNN