原帖地址:http://www.iteye.com/topic/266705
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里面做个配置
Xml代码
<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("字符集")可以派上用场。
分享到:
相关推荐
本文将纠正“关于'form表单提交数据编码方式和tomcat接受数据解码方式的思考'”一文中可能存在的错误,并深入探讨相关知识点。 首先,表单数据的编码方式主要取决于`<form>`标签的`enctype`属性。默认情况下,如果...
本篇将详细介绍如何使用Servlet来接收form表单提交的数据,并将其在网页上呈现。 一、Servlet生命周期 Servlet具有三个主要阶段:加载、初始化和服务。当客户端首次请求Servlet时,服务器会加载并初始化Servlet,...
在HTTP协议中,表单数据默认使用ISO-8859-1编码,而我们可能期望的是UTF-8或者其他支持多语言的编码方式。为了解决这个问题,我们可以利用Java的Servlet过滤器(Filter)机制来处理请求。 1. **创建过滤器**: 在...
2. **设置表单提交编码**:对于POST方式提交的表单,需要在Servlet处理请求之前,通过`HttpServletRequest`的`setCharacterEncoding`方法设定请求的字符编码。如示例代码中的`req.setCharacterEncoding("utf-8")`,...
2. **Form认证**:Form认证是更安全且用户友好的方式,它引导用户通过一个登录表单提交凭据。Tomcat使用Jaas(Java Authentication and Authorization Service)来处理这些凭据。 下面,我们将详细介绍如何配置和...
在本文中,我们将深入探讨如何使用POST方式提交数据到Tomcat服务器。POST方式与GET方式在创建Web工程时虽然基本架构相同,但在处理请求时有显著的区别。POST方式主要用于发送大量或敏感的数据,因为它可以携带的数据...
【使用Get方式提交数据到Tomcat服务器的方法】 在Web开发中,向服务器发送数据是常见的需求,而HTTP协议提供了两种主要的方式:GET和POST。本文将重点讲解如何使用GET方式向Tomcat服务器提交数据,并接收处理结果。...
用户在JSP页面填写表单后,提交数据到同一页面。此时,JSP页面可以调用JavaBean的相应方法处理这些数据,而不是像传统方式那样提交到另一个URL。 在JSP页面中,使用`<jsp:useBean>`指令实例化JavaBean,然后通过`...
当访问服务器中受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,它们是: 1、BASIC(基本验证):通过HTTP验证,需要提供base64编码文本的用户口令 2、DIGEST(摘要...
1. **表单提交数据**:确保表单的`enctype`属性设置为`application/x-www-form-urlencoded`或`multipart/form-data`。默认情况下,`enctype`为`application/x-www-form-urlencoded`,这时POST提交的数据会使用UTF-8...
在B/S架构中,客户端浏览器向服务器提交数据主要有两种方式:表单(Form)提交和Ajax异步请求。对于表单提交,浏览器会根据操作系统的默认编码(如GBK)对输入数据进行编码。而在Ajax请求中,情况有所不同,...
1. Tomcat5默认使用ISO-8859-1编码处理表单(POST)提交的数据。 2. 对于GET请求,Tomcat5采取不同于POST请求的处理方式,导致设置`REQUEST.setCharacterEncoding("GBK")`无效。 **解决办法:** **方法一:实现...
##### 3.1 设置表单编码 为了避免POST请求中的中文乱码问题,可以在HTML表单中明确指定`charset`属性,确保表单数据使用正确的编码格式。例如,在HTML表单标签中添加`charset="UTF-8"`属性。 ```html <form action...
- 修改`server.xml`:Tomcat的主配置文件中,可以在`<Connector>`标签内设置`URIEncoding`属性来指定请求的编码方式,例如`URIEncoding="UTF-8"`。 - 配置`context.xml`:对于特定的Web应用,可以在`META-INF/...
4. **处理表单提交数据**:对于表单提交的数据,可以通过设置合适的编码格式来避免乱码。 #### 三、具体解决步骤 根据题目描述中的部分代码片段,我们可以看到一个`Connector`元素的配置,其中有一个属性`...
GET方式提交中文数据时,由于Tomcat默认使用ISO-8859-1编码URL参数,同样可能导致乱码。解决方法包括: - **解码转换**:在服务器端对GET参数进行解码再转码,如上所述。 - **修改Tomcat配置**:在`server.xml`的...
1. **设置请求编码**:在Servlet的`doGet`方法中,我们可以手动指定请求参数的编码方式。例如,使用`HttpServletRequest`的`setCharacterEncoding`方法来设定请求的字符编码: ```java request.setCharacter...
2. **表单提交编码问题**:HTML表单提交数据时,如果没有明确指定编码方式,可能会使用默认的ISO-8859-1编码,而服务器端可能期望的是UTF-8编码。 3. **数据库连接编码设置**:数据库连接时,如果字符集没有正确设置...