- 浏览: 1041671 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
还是一个异常引发的故事:
需要实现一个手机客户端行为分析的需求,手机客户端需要上传一些数据文件。手机客户端通过http协议post方式上传数据文件的时候,我们发现在服务器端无法通过request.getInputStream()获取到相应的数据,调用request.getInputStream()读取数据里头啥都木有。
经过各种尝试我们注意到如下的情况:
1.在不做任何修改的情况下,调用request.getParameter()可以获取到部分数据,即url拼接参数的数据。
2.在不做任何修改的情况下,如果在之前任何地方都不调用request.getParameter(),而是直接调用request.getInputStream()是可以获取到数据的。
3.原来客户端使用默认的请求头Content-Type:application/x-www-form-urlencoded,修改此值为multipart/form-data或者application/octet-stream之后,通过request.getInputStream()可以获取到数据,即使之前调用过request.getParameter()。
最后的解决方法当然是客户端修改Content-Type,因为服务器端request.getInputStream()的方法不方便修改。今天具体分析下里头的原理。
一.从form的enctype属性到Content-Type
写html的时候我们都知道form有个属性enctype,默认值是application/x-www-form-urlencoded,这个值表示会将表单数据用&符号做一个简单的拼接。例如:
如果enctype的值为multipart/form-data,这个值一般用于表单中包含文件上传的情况,它会将表单中的数据使用一个boundary作为分隔上传。例如:
我们注意到这个时候Content-Type也相应的变为multipart/form-data,同时后面还加上了分隔符boundary的描述。
所以,其实form的enctype属性某种程度上决定了Content-Type值和请求body里头的数据格式。
详细的可以参考:http://imzc.net/archives/131
二.从Content-Type到request.getInputStream()
上面说到了form的处理情况,但是其实如果我们不是使用浏览器,而是自己实现的客户端来传递数据的话,这些头信息就得都由自己处理。
所以上面就出现了,上传文件的时候仍然使用了application/x-www-form-urlencoded的不标准用法。
但是为啥Content-Type会影响request的处理呢?这得从request的一些实现说起。
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如: 当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter() 方法得到参数后,再调用 request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用 request.getParameter()时系统可能对表单中提交的数 据以流的形式读了一次,反之亦然。
当form表单内容采用 enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,但是这时调用 request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,即使已经调用了 request.getParameter()方法也 可以通过调用request.getInputStream()或request.getReader()得 到表单中的数据,而request.getInputStream()和request.getReader()在同 一个响应中是不能混合使用的,如果混合使用就会抛异常。
更多也可以参考:http://robert-liu.iteye.com/blog/713568
http://topic.csdn.net/u/20110213/22/360270bd-895f-4844-ba36-b6c9295c5360.html
需要实现一个手机客户端行为分析的需求,手机客户端需要上传一些数据文件。手机客户端通过http协议post方式上传数据文件的时候,我们发现在服务器端无法通过request.getInputStream()获取到相应的数据,调用request.getInputStream()读取数据里头啥都木有。
经过各种尝试我们注意到如下的情况:
1.在不做任何修改的情况下,调用request.getParameter()可以获取到部分数据,即url拼接参数的数据。
2.在不做任何修改的情况下,如果在之前任何地方都不调用request.getParameter(),而是直接调用request.getInputStream()是可以获取到数据的。
3.原来客户端使用默认的请求头Content-Type:application/x-www-form-urlencoded,修改此值为multipart/form-data或者application/octet-stream之后,通过request.getInputStream()可以获取到数据,即使之前调用过request.getParameter()。
最后的解决方法当然是客户端修改Content-Type,因为服务器端request.getInputStream()的方法不方便修改。今天具体分析下里头的原理。
一.从form的enctype属性到Content-Type
写html的时候我们都知道form有个属性enctype,默认值是application/x-www-form-urlencoded,这个值表示会将表单数据用&符号做一个简单的拼接。例如:
POST /post_test.php HTTP/1.1 Accept-Language: zh-CN User-Agent: Mozilla/4.0 Content-Type: application/x-www-form-urlencoded Host: 192.168.12.102 Content-Length: 42 Connection: Keep-Alive Cache-Control: no-cache title=test&content=%B3%AC%BC%B6%C5%AE%C9%FA&submit=post+article我们注意到这个时候Content-Type为application/x-www-form-urlencoded。
如果enctype的值为multipart/form-data,这个值一般用于表单中包含文件上传的情况,它会将表单中的数据使用一个boundary作为分隔上传。例如:
POST /post_test.php?t=1 HTTP/1.1 Accept-Language: zh-CN User-Agent: Mozilla/4.0 Content-Type: multipart/form-data; boundary=---------------------------7dbf514701e8 Accept-Encoding: gzip, deflate Host: 192.168.12.102 Content-Length: 345 Connection: Keep-Alive Cache-Control: no-cache -----------------------------7dbf514701e8 Content-Disposition: form-data; name="title" test -----------------------------7dbf514701e8 Content-Disposition: form-data; name="content" .... -----------------------------7dbf514701e8 Content-Disposition: form-data; name="submit" post article -----------------------------7dbf514701e8--
我们注意到这个时候Content-Type也相应的变为multipart/form-data,同时后面还加上了分隔符boundary的描述。
所以,其实form的enctype属性某种程度上决定了Content-Type值和请求body里头的数据格式。
详细的可以参考:http://imzc.net/archives/131
二.从Content-Type到request.getInputStream()
上面说到了form的处理情况,但是其实如果我们不是使用浏览器,而是自己实现的客户端来传递数据的话,这些头信息就得都由自己处理。
所以上面就出现了,上传文件的时候仍然使用了application/x-www-form-urlencoded的不标准用法。
但是为啥Content-Type会影响request的处理呢?这得从request的一些实现说起。
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如: 当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter() 方法得到参数后,再调用 request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用 request.getParameter()时系统可能对表单中提交的数 据以流的形式读了一次,反之亦然。
当form表单内容采用 enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,但是这时调用 request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,即使已经调用了 request.getParameter()方法也 可以通过调用request.getInputStream()或request.getReader()得 到表单中的数据,而request.getInputStream()和request.getReader()在同 一个响应中是不能混合使用的,如果混合使用就会抛异常。
更多也可以参考:http://robert-liu.iteye.com/blog/713568
http://topic.csdn.net/u/20110213/22/360270bd-895f-4844-ba36-b6c9295c5360.html
发表评论
-
不同版本(2.3,2.4,2.5)的Servlet web.xml 头信息
2014-01-21 17:17 798Servlet 2.3 <?xml version=&q ... -
Tomcat j_security_check安全策略
2013-08-22 15:06 14621. 内存域:类名,MemoryRealm;在初始化阶段,从X ... -
jsp freemarker velocity 比较
2013-08-01 11:13 955在java领域,表现层技术主要有三种:jsp、freemark ... -
jsp el 和xss
2013-04-16 14:44 3259jsp 2.0中的 ${todo.description}是不 ... -
jsp framework
2013-04-04 11:40 933freemarker 优点: 1、不能编写java代码,可 ... -
response.isCommitted()
2012-12-24 15:37 10138HelloServlet类的service()方法最后调用Pr ... -
jsessionid的困扰
2012-11-24 20:44 1674[size=x-large]问题:向某银行发送支付请求时,如果 ... -
Tomcat的Session设置
2012-11-24 00:37 11151、为单个WEB设置SESSION 在WEB.XML中添加 ... -
servlet多线程
2012-07-17 15:49 871一,servlet容器如何同时处理多个请求。 Servlet采 ... -
注解@PostConstruct与@PreDestroy
2012-07-11 18:13 0从Java EE 5规范开始,Servlet中增加了两个影响S ... -
HTTP Post 文件的一些细节【转载】
2012-03-09 18:32 1546JSP/SERVLET上载的难点 1、支持任意格式、任意 ... -
使用javarebel 实现tomcat 动态加载类---热部署 [转载]
2011-10-10 18:26 1195在项目中开发都是使用tomcat,当类修改之后,新加field ... -
设置WebLogic启动内存
2011-03-23 15:24 1632我们经常在使用WebLoigc部署应用程序后,发现程序运 ... -
EL 表达式 访问集合和String的 的内置方法(比如:size ,contains, indexOf ,endWith...)
2011-03-07 19:14 1460称呼 Functions 标签库为标签库,倒不如称呼其为函数库 ... -
EL表达式
2011-03-07 19:13 987the JavaServer Pages Standard T ... -
判断点是否在任意多边形内(java)
2011-03-05 22:34 5881import java.util.ArrayList; ... -
Unknown constant tag 115 in class file jsp_servlet/_finance/__caiwuzhuangkuangou
2010-12-08 12:09 1522Error 500--Internal Server Erro ... -
jsp
2010-11-19 16:33 1421index.jsp:13:22: "E:\BEA\u ...
相关推荐
解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?
四种常见的 POST 提交数据方式对应的content-type取值(enctype)
解决上传文件enctype= multipart/form-data 时无法传递其他参数的问题,以及项目全局编码问题。用的插件是commons io + commons fileupload
解决当FORM的ENCTYPE="multipart/form-data" 时action方法或者控制层用request.getParameter()获取不到值的方法 ?
解决java enctype multipart form-data文件上传传值问题 不使用jspsmartupload组件 可以轻轻松松 解决传值问题
encType="multipart/form-data" 根据上传不同,主要分两步,可以有效的解决request.getParameter(String s)是null值
//注意action地址,还有enctype要写成multipart/form-data,和method="POST" <form name="uploadform" method="POST" action="./servlet/FileUpload" ENCTYPE="multipart/form-data"> <tr><td width="100%" ...
我们都知道要让form能提交文件,需要在form上指定enctype=multipart/form-data的attribute,这样才能上传文件,关于enctype的文章很多,就不再做解释。 问题是因为使用了MVC的Html.BeginForm()来输出表单代码,默认...
ssid=xiaomi&encryption=NONE&enctype=NONE&channel=1%3B%2Fusr%2Fsbin%2Ftelnetd,然后查看返回的JSON数据{"msg":"未能连接到指定WiFi(Probe timeout)","code":1616},返回码有可能不同,但是这里已经可以通过...
servlet上传 enctype="multipart/form-data" servlet上传 enctype="multipart/form-data
commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...
// headers:{"ClientCallMode" : "ajax"},//添加请求头部 enctype="multipart/form-data" success: function(data){ if(data.msg=="success"){ alert("保存成功"); }else{ alert("保存失败")...
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。 值 描述 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 不对字符编码。在使用包含文件上传控件...
在文件上载和表单提交的过程中,有两个指的关心的问题,一是上载的数据是是采用的那种方式的编码,这个问题的可以从 Content-Type 中得到答案,另一个是问题是上载的数据量有多少即 Content-Length ,知道了它,就...
Enctype :指定将数据回发到服务器时浏览器使用的编码类型。用于表单里有图片上传。 编码类型有以下三种: application/x-www-form-urlencoded: 在发送前编码所有字符(默认)。这是标准的编码格式。 multipart/...
使用中需要注意的问题: 1,不能直接使用Request.form()方法,否则报错 请求对象 错误 'ASP 0206 : 80004005' 这是因为上传类调用的BinaryRead方法...2,使用上传类时form标签必须添加属性 enctype="multipart/form-data
另外,还需要增加上传的属性enctype= “multipart/form-data”,该属性说明浏览器可以提供文件上传功能。 2.编写处理表单提交的PHP脚本 当用户通过上传表单选择一个文件并提交后,PHP会自动生成一个$_FILES的二维...
out.print("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title&...
content=request.form(\"content\") set rs=server.createobject(\"adodb.recordset\") sql=\"select * from biao\" rs.open sql,conn,3,2 rs.addnew rs(\"name\")=name if content<>\"\" then rs(\"content\...
用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 下边是说明: application/x-www-form-urlencoded : 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data : 窗体数据被编码为...