POST和GET的区别
1、原理不同:
一般我们在浏览器输入一个网址访问网站都是GET请求;在FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。HTTP定义了与服务器交互的不同方式,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅仅指不会修改信息。根据HTTP规范,POST可能会修改服务器上的资源的请求。
2、数据量
GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般默认为不受限制。
3、安全性、效率
传统的比较都是觉得GET安全性非常低,POST安全性较高。因为GET请求的数据会暴露在地址栏中,而POST请求则不会。但是GET的执行效率比POST方法好。通过我们自己做的网站也是可以追踪到,GET提交的数据,用户名和密码将会明文出现在URL上。
Ajax中POST和GET的区别
Get和Post都是向服务器发送的一种请求,只是发送机制不同。
1.GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器。当然在Ajax请求中,这种区别对用户是不可见的。
2.首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。
3.GET方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等。在某种情况下,GET方式会带来严重的安全问题。而POST方式相对来说就可以避免这些问题。
get请求和post请求在服务器端的区别:
4.在客户端使用get请求时,服务器端使用Request.QueryString来获取参数,而客户端使用post请求时,服务器端使用Request.Form来获取参数.
HTTP标准包含这两种方法是为了达到不同的目的。POST用于创建资源,资源的内容会被编入HTTP请示的内容中。例如,处理订货表单、在数据库中加入新数据行等。
当请求无副作用时(如进行搜索),便可使用GET方法;当请求有副作用时(如添加数据行),则用POST方法。一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长度的限制。
若符合下列任一情况,则用POST方法:
* 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
* 若使用GET方法,则表单上收集的数据可能让URL过长。
* 要传送的数据不是采用7位的ASCII编码。
若符合下列任一情况,则用GET方法:
* 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
* 请求结果无持续性的副作用。
* 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符。
Get提交与post提交乱码问题
AJAX Get提交与post提交乱码问题
Get和Post都是向服务器发送的一种请求,只是发送机制不同。
1. GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器。当然在Ajax请求中,这种区别对用户是不可见的。
2. 首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。
3. GET方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等。在某种情况下,GET方式会带来严重的安全问题。而POST方式相对来说就可以避免这些问题。
get请求和post请求在服务器端的区别:
4. 在客户端使用get请求时,服务器端使用Request.QueryString来获取参数,而客户端使用post请求时,服务器端使用Request.Form来获取参数.
HTTP标准包含这两种方法是为了达到不同的目的。POST用于创建资源,资源的内容会被编入HTTP请示的内容中。例如,处理订货表单、在数据库中加入新数据行等。
当请求无副作用时(如进行搜索),便可使用GET方法;当请求有副作用时(如添加数据行),则用POST方法。一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长度的限制。
若符合下列任一情况,则用POST方法
* 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
* 若使用GET方法,则表单上收集的数据可能让URL过长。
* 要传送的数据不是采用7位的ASCII编码。
若符合下列任一情况,则用GET方法:
* 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
* 请求结果无持续性的副作用。
* 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符
Tomcat在处理GET和POST请求时产生的乱码问题
后端传输到前端数据乱码问题
一般统一UTF-8编码
response.setContentType("text/html;charset=utf-8");
前端传输到后端数据乱码问题
一般的处理乱码的方式都是用:
request.setCharacterEncoding("UTF-8")
但是这种方法只对POST方法提交的表单才有效果,这就是前面提到的有时候有效果,有时候没有效果的原因。
网 上资料显示:自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会 仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。
鉴于此,提供一下三种解决方法:
1.将GET请求改成POST请求,然后就可以使用request.setCharacterEncoding方法设置编码,并使用request.getParameter方法直接获得中文请求参数了,这种方法简单明了。
2.不用改GET请求,在Servlet中使用如下的代码来得到中文请求参数。
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
byte[] bytes = request.getParameter("name").getBytes("iso8859-1");
String name = new String(bytes,"UTF-8");
3.对于GET方法,还可以通过修改Tomcat的配置来搞定。
方法如下:
在conf/server.xml里的<Connector />标签内加URIEncoding=" UTF-8",或者是UTF-8。如:
<Connector?port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
对于POST方法提交的表单,上面的方法二仍然有效,个人建议使用方法二,因为方法二的代码是利用了Java的编码能力,对于所有的Web服务器都会有效,而setCharacterEncoding方法是通过Web服务器支持的,并不是所有的Web服务器都会对该方法有很好的支持。
HTTP基础:URL格式、 HTTP请求、响应、消息
HTTP URL
格式:
http://host[:port][abs_path]
其中http表示要通过HTTP协议来定位网络资源。
host表示合法的Internet主机域名或IP地址(以点分十进制格式表示);
port用于指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接。
如果port是空,则使用缺省的端口80。当服务器的端口不是80的时候,需要显式指定端口号。
abs_path指定请求资源的URI(Uniform ResourceIdentifier,统一资源定位符),如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出。通常这个工作浏览器就帮我们完成了。
浏览器与服务器连接的一般过程:
(以sohu网站为例):
URL与URI
URI纯粹是一个符号结构,用于指定构成Web资源的字符串的各个不同部分。
URL是一种特殊类型的URI,它包含了用于查找某个资源的足够的信息。
其他的URI,例如:mailto:zhanglong217@yahoo.com.cn,则不属于URL,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN(通用资源名)。
HTTP请求
客户端通过发送HTTP请求向服务器请求对资源的访问。
HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。
请求行以一个方法符号开头,后面跟着请求URI和协议的版本,以CRLF作为结尾。
请求行以空格分隔。除了作为结尾的CRLF外,不允许出现单独的CR或LF字符,格式如下:
Method Request-URIHTTP-Version CRLF
Method表示请求的方法,Request-URI是一个统一资源标识符,标识了要请求的资源,HTTP-Version表示请求的HTTP协议版本,CRLF表示回车换行。
例如:
GET /test.html HTTP/1.1 (CRLF)
HTTP请求方法
GET方法
GET方法用于获取由Request-URI所标识的资源的信息,常见形式是:
GET Request-URI HTTP/1.1
当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是GET方法向服务器获取资源。
最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind,这样通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。以用google搜索domety为例,Request格式如下:
GET/search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif,image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash,*/*
Referer: <ahref="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language:zh-cn
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <ahref="http://www.google.cn">www.google.cn</a>
Connection:Keep-Alive
Cookie:PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
可以看到,GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址链接如下:
<ahref="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp
&q=domety&aq=f&oq=</a>
地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。
POST方法
POST方法用于想服务器发送请求,这点和GET方法没有区别。但是POST方法要求服务器接收附在请求后面的数据。
POST方法在表单提交的时候用的最多。
采用POST方法提交表单的例子
POST /login.jsp HTTP/1.1 (CRLF)
Accept: image/gif (CRLF) (…)
Host: www.sample.com (CRLF) (…)
…
Cache-Control: no-cache (CRLF)
(CRLF)
username=hello&password=123456
当我们在HTML中提交表单时,浏览器会根据你的提交方法是get还是post,采用相应的在HTTP协议中的GET或POST方法,向服务器发出请求。
注意,在HTML文档中,书写get和post,不区分大小写,但HTTP协议中的GET和POST只能是大写形式。
对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式,因为使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。还以上面的搜索domety为例,如果使用POST方式的话,格式如下:
POST /searchHTTP/1.1
Accept: image/gif,image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,application/vnd.ms-powerpoint,
application/msword, application/x-silverlight, application/x-shockwave-flash,*/*
Referer: <ahref="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language:zh-cn
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <ahref="http://www.google.cn">www.google.cn</a>
Connection:Keep-Alive
Cookie:PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety
可以看到,POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。
HEAD方法
HEAD方法与GET方法几乎是一样的,它们的区别在于HEAD方法只是请求消息报头,而不是完整的内容。
对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。
利用这个方法,不必传输整个资源的内容,就可以得到Request-URI所标识的资源的信息。
这个方法通常用于测试超链接的有效性,是否可以访问,以及最近是否更新等。
HTTP响应
在接收和解释请求消息后,服务器会返回一个HTTP响应消息。
与HTTP请求类似,HTTP响应也是由三个部分组成,分别是:状态行,消息报头,相应正文。
状态行由协议版本,数字形式的状态代码,相应的状态描述组成,各元素之间以空格分隔,除了结尾的CRLF(回车换行)序列外,不允许出现CR或LF字符。格式如下:
HTTP-Version Status-CodeReason-Phrase CRLF
HTTP-Version表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应代码,Reason-Phrase表示状态代码的文本描述,CRLF表示回车换行。
例如:
HTTP/1.1 200 OK (CRLF)
HTTP响应——状态代码与状态描述
状态代码由三位数字组成,表示请求是否被理解或被满足,状态描述给出了关于状态代码的简短文本描述。
状态代码的第一个数字定义了响应的类别,后面两个数字没有具体的分类。
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error//服务器发生不可预期的错误
503 ServerUnavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
状态行由协议版本,数字形式的状态代码,相应的状态描述组成,各元素之间以空格分隔,除了结尾的CRLF(回车换行)序列外,不允许出现CR或LF字符。格式如下:
HTTP-Version Status-CodeReason-Phrase CRLF
HTTP消息
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。
请求消息和响应消息都是由开始行,消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
对于请求消息,开始行就是请求行,对于相应消息,开始行就是状态行。
实验工具:Telnet
HTTP协议与TELNET协议都是基于TCP协议。
参考与转载地址:https://www.cnblogs.com/coco-dot/p/6424446.html
https://www.cnblogs.com/super-z/p/6230119.html