AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式
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中的获取方式相关推荐
- 获取referer中的请求参数_Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法...
本文实例讲述了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法.分享给大家供大家参考,具体如下: HTTP请求中,如果是get请求,那么 ...
- vue axios POST请求中参数以form data和request payload形式的原因
HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value& ...
- form data和request payload的区别
2019独角兽企业重金招聘Python工程师标准>>> HTML <form> 标签的 enctype 属性 在下面的例子中,表单数据会在未编码的情况下进行发送: < ...
- http请求中的Query String Parameters、Form Data、Request Payload
参考: (1).(http请求参数之Query String Parameters.Form Data.Request Payload) - https://www.jianshu.com/p/c81 ...
- python爬虫post请求翻页_python爬虫如何POST request payload形式的请求
python爬虫如何POST request payload形式的请求 1. 背景 最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POS ...
- java request payload_前后端联调之Form Data与Request Payload,你真的了解吗?
前言 做过前后端联调的小伙伴,可能有时会遇到一些问题.例如,我明明传递数据给后端了,后端为什么说没收到呢?这时候可能就会就会有小伙伴陷入迷茫,本文从chrome-dev-tools(F12调试器)中看 ...
- Query String Parameters、Form Data、Request Payload的区别
Query String Parameters 当发起一次GET请求时,参数会以url string的形式进行传递.即?后的字符串则为其请求参数,并以&作为分隔符. 如下http请求报文头: ...
- python提交post请求payload webkit_python爬虫实现POST request payload形式的请求
1. 背景 最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数据格式(Form data).而使用Form data数据的提交方式 ...
- python requests form data_Python爬虫:Request Payload和Form Data的简单区别说明
Request Payload 和 Form Data 请求头上的参数差别在于: Content-Type Form Data Post表单请求 代码示例 headers = { "Cont ...
最新文章
- android 虚拟按键挡住布局,Android 关于导航栏(虚拟按键)遮挡PopupWindow底部布局的问题...
- SWIG,C#沟通C++的桥梁
- js---PC端滑动进度条
- 分布式应用的未来 — Distributionless
- 大三、研二的秋招备战路线(Java、大数据)
- Linux 平台下 Tomcat 的安装与优化
- 10.企业安全建设入门(基于开源软件打造企业网络安全) --- 数据库安全
- ENVI学习总结(十五)——遥感影像分类与应用
- Facebook高效工作Tips
- WFP 学习(一)——构架把握
- windows系统下自定义图标
- 子矩阵的和(Python实现)
- Nacos 1.1.0发布,支持灰度配置和地址服务器模式
- 知之者不如好之者 好之者不如乐之者
- UE4-灯光烘焙效果质量不佳解决方法
- html base64 img 图片显示
- C++学校图书馆管理系统
- Android 音视频开发(一):PCM 格式音频的播放与采集
- 路由器RIP动态路由配置——思科模拟器学习
- SpringDataJpa框架使用【超详细!】