`
sorphi
  • 浏览: 46447 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

获取form post的charset【改造版】

阅读更多
前面提到过我的一个低级失误并对servlet的setCharacterEncoding有了正确认识。

 

主要是基于这么一个思路解决我的问题: 


<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>
...

<form method="post" action="/servlet" accept-charset="utf-8">
<input type="hidden" name="_charset_"/>
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

  

 

 

这个表单配合原来在weblogic下写的filter代码,在IE和firefox下运行正常。但既然遵循servlet规范,不能在filter中通过_charset_这个request参数来获取浏览器对post body的真实编码,只能想点歪门邪道了。向jsessionid取经,这个表单改成这样:(关于URL中的分号,请参考RFC1738,这里有个中文版

 

<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>

...
<form method="post" action="/servlet;_charset_=utf-8" accept-charset="utf-8">
<input type="hidden" name="_charset_"/>
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

 

 

 

 filter的改造就略了,无非是hack下request uri。幸好遗留应用并不需要url中重写jsessionid。wink

 

测试,运行,firefox正常了,IE又不正常。哦,恍然大雾啊,原来firefox是严格的根据accept-charset来编码,若accept-charset不存在,则按response或者meta http-equiv="Content-Type"中的声明来编码,最后把编码方式放到_charset_隐藏域。而IE还是顽固的只按照response或者meta http-equiv="Content-Type"中的声明来编码,并把编码方式放到_charset_隐藏域。原来IE无视accept-charset的存在。我原先一直以为_charset_隐藏域只是IE对accept-charset的一个强制辅助呢,又一个一知半解的典型...

 

得了,只能让firefox和IE同流合污了。最终,表单变成这样:

 

<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>

...
<form method="post" action="/servlet;_charset_=gbk">
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

 

在IE和firefox下均测试通过。

 

3
1
分享到:
评论
1 楼 moshalanye 2009-01-16  
    做学问的确是个细致的事情,浏览器默认把字节流进行iso8859-1编码再传送服务器,我开始的理解也是form acceptcharset应该会在使用iso8859-1编码前把form中的数据转码成utf-8的形式,结构两种浏览器反映不一样,我也茫然了,看了兄弟你的帖子才恍然,而filter中赋给request的编码方式,则是给服务器对请求流进行 1。对请求字节流使用iso8859-1解码,再使用正确的编码方式编码。 这个过程并不是转码!  而是使用正确的编码格式还原请求的原貌!   
    这样说来,form acceptcharset 貌似并不会给服务器使用的,并不会在request中确定正确编码方式,只是给客户端浏览器使用的参数而已。
    如果评论有误,请不吝赐教,不胜感激!

相关推荐

    js获取form表单

    ### JS 获取 Form 表单数据知识点详解 #### 一、标题与描述理解 根据提供的标题“js获取form表单”及描述“ajax js一次性获取form表单”,我们可以明确本篇文章将围绕JavaScript(简称JS)中如何通过Ajax技术一次...

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

    本篇文章主要探讨如何在Servlet中处理AJAX POST请求,特别是当请求参数以`form data`和`request payload`两种不同形式传递时。 首先,理解HTTP请求的基本结构。GET请求的参数通常附加在URL后面,而POST请求的参数...

    Delphi7 multipart/form-data实现上传文件

    根据服务器的响应格式,你可以解析这些信息以获取上传结果。 8. **清理资源**:别忘了在完成后释放 `DataStream` 和 `Response` 对象。 在你的项目中,`sendfile_pas.pas` 文件很可能是包含上述步骤的实现代码。你...

    servlet接收form表单提交的数据

    当我们需要从HTML表单(form)中获取用户输入的数据并在网页上显示时,Servlet扮演着关键角色。本篇将详细介绍如何使用Servlet来接收form表单提交的数据,并将其在网页上呈现。 一、Servlet生命周期 Servlet具有三个...

    调用pb开发的webserver(HTTP POST)

    调用pb开发的webserver(HTTP POST) .../*获取结果 HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Content-Length: length &lt;short xmlns="http://webi.org"&gt;short*/ //出参是json格式{"statusCode":"2"}

    解决axios post 后端无法接收数据的问题

    在后端 允许跨域的情况下,axios post 将数据传到后端,但是后端无法接收,始终为空 请求能正常到达后端,那么肯定传数据的地方的问题了 所以这里headers设置为 headers:{"Content-Type":'application/x-...

    解决了中文乱码的http的get和post请求demo

    httpPost.setHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8"); List&lt;NameValuePair&gt; params = new ArrayList(); params.add(new BasicNameValuePair("param", "中文参数")); ...

    c# Post提交图片

    charset=utf-8"; ``` 上述代码创建了一个`HttpWebRequest`对象,并设置了请求方法为POST以及Content-Type。需要注意的是,这里设置的Content-Type并不是发送图片的标准格式`multipart/form-data`,而是用于提交...

    POST方法发送payload形式的请求1

    在处理某些特定的POST请求时,我们可能会遇到一种名为"request payload"的数据格式,它与传统的"Form data"有所不同。本文将详细介绍"payload"形式的POST请求,以及如何使用Python的requests库来实现这种请求。 ...

    struts2 使用action属性接收中文参数(post提交)

    - 表单编码:在HTML表单中,可以使用`accept-charset`属性指定编码,如`&lt;form method="post" accept-charset="UTF-8"&gt;`。 - Servlet容器配置:在Tomcat等Servlet容器的配置文件(server.xml或web.xml)中,可以...

    cgi_form_gb2312.html

    同时,可能还需要检查`HTTP_ACCEPT_CHARSET`以获取客户端的接受字符集。 6. **数据转换**:如果服务器和脚本支持不同的字符集,可能需要在接收数据后进行转换,如从GB2312转为UTF-8。 在 boa-0.94.13 版本中,可能...

    java web学习_浅谈request对象中get和post的差异

    在上面的代码中,我们使用 doPost 方法来处理 POST 请求,并获取表单中的参数。 3. GET 和 POST 的差异 GET 和 POST 方法的主要差异在于数据传输的方式。GET 方法是通过 URL 传递参数的,而 POST 方法是通过 ...

    js以post方式打开新页面

    &lt;button onclick="submitForm()"&gt;以POST方式打开新页面 function submitForm() { var form = document.getElementById('myForm'); // 这里可以添加更多的动态数据到表单 // form.appendChild(document....

    jQuery的ajax发送FormData的方式

    meta charset="UTF-8"&gt; &lt;title&gt;Document&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form id="form"&gt; &lt;input type="text" name="username"&gt; &lt;input type="file" name="file"&gt; &lt;...

    jqueryform.js

    type:"post", dataType:"json", //data:{reviewer:encodeURI(reviewer)}, contentType: "application/x-www-form-urlencoded; charset=GBK", // headers:{"ClientCallMode" : "ajax"},//添加请求头部 enctype=...

    PHP Post获取不到非表单数据的问题解决办法

    在PHP开发过程中,有时会遇到一个常见的问题,即使用POST方法发送的数据无法在服务器端的PHP脚本中正常获取。这种情况通常发生在使用非表单数据(如JSON格式)进行通信时,例如通过Vue.js和axios库。本文将详细介绍...

    php提交表单的测试demo

    &lt;meta charset="UTF-8"&gt; &lt;title&gt;PHP POST表单提交测试 &lt;form action="process_form.php" method="post"&gt; 用户名: &lt;input type="text" id="username" name="username"&gt;&lt;br&gt; 密码: ...

    jsp中charset和pageEncoding

    - **表单提交乱码**:通过设置表单提交时的编码方式,如`&lt;form action="submit.jsp" method="post" accept-charset="UTF-8"&gt;`。 #### 三、示例分析 接下来,我们将通过一个具体的例子来深入理解如何在JSP中正确...

    ajax_json_post_ashx获取参数值

    在实际开发中,可能会遇到`context.Request.Form`和`context.Request.Params`无法正确获取POST数据的问题,我们将探讨这个问题的原因以及解决方案。 首先,了解AJAX的基本概念。AJAX允许网页在不重新加载整个页面的...

    get、post请求中文乱码处理方式一

    - 参数编码:客户端对POST数据进行编码,比如在Java中使用`URLEncoder.encode()`,在JavaScript中使用`new Blob([data], {type: 'application/x-www-form-urlencoded;charset=utf-8'})`。 - 服务器端接收:服务端...

Global site tag (gtag.js) - Google Analytics