发现将表单的 encType 从“multipart/form-data”更改为“application/x-www-form-urlencoded”可以解决此问题。不过很奇怪!不知道为什么它不适用于多部分加密。
首先,它不是加密,而是编码。差异是相当大的。“加密”是一种以这种方式更改值的方式,这种方式在没有安全密钥(密码密钥、种子等)的情况下是不可预测的。“编码”是一种以数据传输机制可以接受和/或另一方可识别/可解析而不会丢失任何数据的方式更改值的方式。这些值并没有变得不可读或其他什么,它们只是被安排得有些具体和不同。
回到您的具体问题,multipart/formdata
编码通常仅在您需要能够与表单一起发送(上传)文件时使用,例如使用<input type="file">
RichFaces<rich:fileUpload>
组件。标准的application/x-www-form-urlencoded
表单编码,它基本上规定了请求参数应该以这种格式发送 URL-encoded
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
name1=value1&name2=value2&name3=value3
不适合传递文件内容。为此,multipart/form-data
应该使用基本上如下所示的编码:
Content-Type: multipart/form-data;boundary=SOME_BOUNDARY
--SOME_BOUNDARY
content-disposition: form-data;name="name1"
content-type: text/plain;charset=UTF-8
value1
--SOME_BOUNDARY
content-disposition: form-data;name="name2"
content-type: text/plain;charset=UTF-8
value2
--SOME_BOUNDARY
content-disposition: form-data;name="name3"
content-type: text/plain;charset=UTF-8
value3
--SOME_BOUNDARY--
这种格式允许在请求正文中包含完整的文件内容。
在 JSF 2.0/2.1 Web 应用程序中,multipart/form-data
请求通常由自定义的Filter
. 对于 RichFaces 3,这通常由org.ajax4jsf.Filter
RichFaces 4 中缺少的 处理。
Note that the application/x-www-form-urlencoded
is already the default encoding type of HTML forms. So you don't need to explicitly specify it yourself. Just omit the enctype
attribute altogether:
<h:form>
</h:form>
and you should be all set.