转: html表单中get方式和post方式的区别

一、Get是用来从服务器上得到数据,而Post是用来向服务器上传递数据。 
2Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,而且二者使用“?”链接,而各个变量之间使用“&”链接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL 
3Get是不安全的,由于在传输过程,数据被放在请求的URL中,而现在现有的不少服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,而后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也能够在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的全部操做对用户来讲都是不可见的。 
4Get传输的数据量小,这主要是由于受URL长度限制;而Post能够传输大量的数据,因此在上传文件只能使用Post(固然还有一个缘由,将在后面的提到)。 
5Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。默认是用ISO-8859-1编码 
6GetForm的默认方法。
如下的比较很是很是使用:
javaweb开发有段日子了,有个问题总是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的不少),都是一大堆的介绍如何解决此类的乱码问题,可是没几个把问题的前因后果说清楚的,有时候看了些文章后,觉得本身懂了,可是在开发中乱码问题又像鬼魂同样出来吓人,真是头大了!这篇文章是我长时间和乱码作斗争的一些理解的积累,还但愿有更多的朋友给出指点和补充。 
  form2中方法把数据提交给服务器,getpost,分别说下吧。 
(一)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里面的中文或特殊字符用 javascriptURL 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)是如何将数据获取到进行解码的。 javascript

第一步是先把数据用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-8GBK对数据 URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里咱们能够直接 
Java代码 
1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式") 
还原回字节码,而后用正确的方式解码数据,网上的文章一般是在tomcat里面作个配置 
Xml代码 
1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>  
这样是让tomcat在获取数据后用指定的方式URL decoderURL decoder的介绍在这里 
(一)post提交 
1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。 
  post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢? 
   form所在的html文件里若是有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBKutf-8等)"/>,那么post就会用此处指定的编码方式编码。通常你们都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,因此网站都会把它放在html代码的最前端,尽可能不出现乱码,其实它还有个做用就是指定form表单的post方法提交数据的 URL encode编码方式。从这里能够看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(能够用js作统一指定),而post方法,开发人员能够指定。 
2。服务器端(tomcat)是如何将数据获取到进行解码的。 
若是用tomcat默认缺省设置,也没作过滤器等编码设置,那么他也是用iso-8859-1解码的,可是request.setCharacterEncoding("字符集")能够派上用场。 

我发现上面说的tomcat所作的事情前提都是在请求头里没有指定编码方式,若是请求头里指定了编码方式将按照这种方式编码。 
   2篇文章推荐下,地址分别是 
深刻浅出URL编码:http://www.cnblogs.com/yencain/articles/1321386.html 
表单用post方法提交数据时乱码问题:http://wanghuan8086.javaeye.com/blog/173869 

post很重要的在form所在的html文件里若是有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBKutf-8等)"/>html

相关文章
相关标签/搜索