`
rubyeye
  • 浏览: 27439 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

form表单提交数据编码方式和tomcat接受数据解码方式的思考

阅读更多
  做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。
  form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
  1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
  
    对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc
(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。
   2。服务器端(tomcat)是如何将数据获取到进行解码的。
   第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接
new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")

还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>

这样是让tomcat在获取数据后用指定的方式URL decoder,URL decoder的介绍在这里


(一)post提交
1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。
  在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?
   在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。
2。服务器端(tomcat)是如何将数据获取到进行解码的。
如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。

我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。
   有2篇文章推荐下,地址分别是
http://www.cnblogs.com/yencain/articles/1321386.html
http://wanghuan8086.iteye.com/blog/173869
分享到:
评论
13 楼 zchaony 2009-10-14  
filter
12 楼 czwlucky 2009-10-13  
不知道大家有没有遇到这样的参数?
http://aa.com?name&age=abc99
这里是希望name&age是key,abc99是值,像这样的参数如何处理才正确呢?
我现在遇到的问题出在webwork的使用上,它使用ognl自动组装参数到对象,但遇到这样的参数时会抛异常。
11 楼 jieyuan_cg 2009-07-05  
解决get方法提交参数乱码问题的关键:在页面response回去之前,如果页面中的url里面带有中文字符,就一定把这个中文字符进行编码。经过编码后的字符串都类似于%xy,不管浏览器用什么方法encode,都不会出错。
10 楼 xukejun_BabyY 2009-06-16  
谢谢分享,有了进一步的理解!!
9 楼 jiongerher 2009-03-02  

rubyeye 写道
在程序里我们可以直接
new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")




请问楼主,我这样理解是否对:



tomcat的解码过程是  解码+解释
tomcat默认是在解码后用ISO8859-1进行解释。 无论给tomcat指定何种URIEncoding方式,实际上都能真确解码,只不过解码后的解释可能会应为设置的URIEncoding,而解释不正确。

所以request.getParameter("name")已经拿到了解码的结果,只是解释的不对。这样理解对吗?
8 楼 asuperfly 2008-12-18  
我的读书笔记:URLDecoder
用post很重要的在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>
强烈建议使用post提交
7 楼 rubyeye 2008-12-12  
hyogacs 写道

提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。

从你的情况看,你的tomcat配置了URIEncoding="UTF-8",并且你可以肯定数据是通过GBK字符集URLEncoder的,那么用你试过的new String(request.getParameter("name").getBytes("UTF-8"),"GBK"))方式就能取到正确的数据。
所以我也不好说了,你再检查下你的数据是通过GBK字符集URLEncoder的吗?
6 楼 hyogacs 2008-12-11  
提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。
5 楼 rubyeye 2008-12-07  
hyogacs 写道

有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz

用你的方法取不到值是有点奇怪了,你的get方法是怎么带参数的呢?
http://www.cnblogs.com/yencain/articles/1321386.html文章里面提到:
http://localhost:8080/大连?name=大连
上面的URL里面,前一个大连和后一个大连的URLEncoder是不一样,你是怎么带参数的呢?
4 楼 hyogacs 2008-11-28  
有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz
3 楼 ddd0401 2008-11-22  
对这问题一直一知半懂的,多谢分享,thinks
2 楼 usherlight 2008-11-21  
good.
1 楼 chhg58 2008-11-21  
对get post 又有了进一步的了解

相关推荐

    关于\"form表单提交数据编码方式和tomcat接受数据解码方式的思考\"一文的纠错

    本文将纠正“关于'form表单提交数据编码方式和tomcat接受数据解码方式的思考'”一文中可能存在的错误,并深入探讨相关知识点。 首先,表单数据的编码方式主要取决于`&lt;form&gt;`标签的`enctype`属性。默认情况下,如果...

    tomcat过滤器,处理表单提交出现乱码

    在Java Web开发中,Tomcat是一个非常常见的应用服务器,它用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。当我们处理表单提交时,可能会遇到数据乱码的问题,尤其是在涉及非ASCII字符集(如中文、...

    使用Post方式提交数据到Tomcat服务器的方法

    在本文中,我们将深入探讨如何使用POST方式提交数据到Tomcat服务器。POST方式与GET方式在创建Web工程时虽然基本架构相同,但在处理请求时有显著的区别。POST方式主要用于发送大量或敏感的数据,因为它可以携带的数据...

    解决jsp提交乱码的问题

    对于POST请求,主要涉及表单提交数据和JSP页面自身编码两方面: 1. **表单提交数据**:确保表单的`enctype`属性设置为`application/x-www-form-urlencoded`或`multipart/form-data`。默认情况下,`enctype`为`...

    彻底解决 Tomcat 5 下文字乱码问题 - JSP日志 - ※一路风尘※

    - 文件上传时,确保表单使用`enctype="multipart/form-data"`,并在处理文件的Servlet中正确解码文件名和内容。 - 文件下载时,通过HTTP响应头设置正确的字符集,例如`Content-Disposition: attachment; filename*...

    Tomcat PostGet 中文編碼處理方法

    对于使用Apache Tomcat服务器的应用程序来说,确保中文字符正确编码是提升用户体验、避免数据损坏的关键环节之一。本文将深入探讨如何在Tomcat环境下正确地处理POST与GET请求中的中文字符,帮助开发者更好地理解和...

    JSP编码以及乱码问题解疑

    GET方式提交中文数据时,由于Tomcat默认使用ISO-8859-1编码URL参数,同样可能导致乱码。解决方法包括: - **解码转换**:在服务器端对GET参数进行解码再转码,如上所述。 - **修改Tomcat配置**:在`server.xml`的...

    Jsp乱码问题解决2

    当使用POST方式提交表单时,如果客户端和服务器端的编码格式不一致,也会导致乱码问题。这是因为默认情况下,Tomcat等Web容器使用`ISO-8859-1`编码处理表单提交的数据。 **解决方法**: 1. **参数解码**: ```java...

    java面试题_第二阶段.pdf

    POST请求用于提交数据,数据放在消息体中,无大小限制,更适合传输大量数据或敏感信息。 - **请求乱码**:由于不同的编码标准,请求数据在客户端和服务器之间传递时可能出现乱码。解决方法包括设定请求编码、使用...

    get和post的区别

    - 使用HTML表单时,通常在`&lt;form&gt;`标签内指定`method="POST"`和`action`属性来定义数据提交的目标URL。 #### 3. 安全性 - **GET**: - 参数直接显示在URL中,容易被浏览器历史记录、缓存或日志文件等记录下来。 ...

    Struts 乱码问题

    2. **表单提交编码问题**:HTML表单提交数据时,如果没有明确指定编码方式,可能会使用默认的ISO-8859-1编码,而服务器端可能期望的是UTF-8编码。 3. **数据库连接编码设置**:数据库连接时,如果字符集没有正确设置...

    org.apache.commons.fileupload.DiskFileUpload使用上

    这很重要,因为浏览器在提交表单时可能会使用不同的字符集编码数据,FileUpload 组件需要正确解码这些信息以获取正确的文本内容和文件路径。 在实际使用中,开发者通常需要根据项目需求配置合适的阈值、最大文件...

    web项目经验总结

    - 对于GET请求,需要先获取请求参数的字节码,然后用正确的编码方式对其进行解码。 **五、无法连接指定数据库** - **问题描述**:尝试使用JDBC连接数据库时,出现连接失败的情况。 - **原因分析**:可能是由于...

    Java Web编程中页面跳转乱码问题的解决方案.zip

    2. 请求参数编码问题:在表单提交或URL传递参数时,如果未正确设置请求编码,中文字符会被错误地转换。 3. JSP/Servlet处理不当:在JSP页面或Servlet中处理请求数据时,如果没有正确设定字符编码,也会导致乱码。 ...

    03.SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢.zip

    总结,解决Spring MVC中的POST和GET请求中文乱码问题,关键在于确保整个系统从客户端到服务器端的字符编码一致性,包括过滤器、控制器参数、表单提交以及服务器配置等。遵循以上步骤,可以有效避免中文乱码的出现。...

    web项目乱码问题 jsp乱码问题解决

    当表单数据以POST方式提交时,Tomcat默认使用iso8859-1编码处理请求参数,而接收端JSP可能期望的是UTF-8编码,这就需要采取措施进行转换。 解决POST提交乱码的方法有以下几种: A. 手动转换:在接收参数时,先将...

    ajax与开发工具InterlliJ开发工具

    在处理中文乱码问题时,通常在服务器端和客户端进行解码和编码转换,例如使用`encodeURI()`和`decodeURI()`方法。 IntelliJ IDEA还提供了一些辅助开发的特性,如`setInterval`函数可以定时与服务器交互,`...

    jsp传值中文乱码问题解决方法示例介绍.docx

    在网页中,数据的编码和解码过程需要保持一致。如果服务器和客户端之间使用的字符编码不同,就可能出现乱码。例如,JSP页面默认的字符编码可能是ISO-8859-1,而用户输入或数据库存储的数据可能使用的是UTF-8编码,这...

    jsp解决乱码方法总结

    **描述:** GET方式提交数据时,参数会出现在URL中,这同样可能导致乱码。 **解决方案:** 1. **修改服务器配置:** 修改Tomcat服务器的配置文件`server.xml`中的`Connector`标签,添加`useBodyEncodingForURI=...

    彻底解决jsp中用SmartUpload上传附件中文乱码问题实用.pdf

    在Java Web开发中,使用SmartUpload组件上传附件时,可能会遇到中文文件名乱码的问题。这个问题通常涉及到字符...关键在于正确处理文件名的编码和解码,以及在下载时设置正确的响应头来告知浏览器文件名的编码方式。

Global site tag (gtag.js) - Google Analytics