Get/Post请求
Get/Post是最常用的两种HTTP请求方法
1.Get请求:
参考W3School
- Get请求的数据通过域名后缀(key / value)URL发送,用户可见,如今很多服务器、代理服务器会将用户请求的URL记录到日志文件中存在某个地方,这样就不太安全。
- GET是从服务器上获取数据
- Get请求传参长度有限制,应该注意的是限制Get请求传参最大长度的不是HTTP协议。而是web服务器限制了URL的长度。一般传递大数据量都不使用get
- Get请求可以被缓存。使用ajax采用get方法请求静态数据的时候,如果两次传输的数据都相同,那么第二次获取所消耗的时间会很短。例如我们访问魅族官网,抓包图如下显式,部分静态文件被自动缓存下来。
2. Post请求
- Post请求的参数是在HTTP消息的主体中发送的,对于用户来说都是不可见的,相对于Get更为安全可靠。
- Post请求不会被缓存。Post请求没有被限制长度,因此常用的文件上传功能都是使用Post请求。
- Post在真正接收数据之前先会将请求头发送给服务器进行确认,然后才真正发送数据。
Post请求过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回100 Continue响应
(5)浏览器发送数据
(6)服务器返回200 OK响应Get请求的过程:
(1)浏览器请求tcp连接(第一次握手)
(2)服务器答应进行tcp连接(第二次握手)
(3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
(4)服务器返回200 OK响应
另外,在提交Get后点击后退按钮可以正常后退,但是Post在提交后点击后退数据会被重新提交(通常浏览器会提示)
转发与重定向的区别
1.转发是服务器行为,重定向是客户端行为。
转发的过程:客户浏览器发送HTTP请求 ----》web服务器接收请求 ----》 调用内部的方法在内部完成请求处理和转发
----》将目标资源发送到客户端。其中转发的URL必须是同一个web容器下的URL,并且地址栏的地址是不会改变的,并且request中的参数也会传递过去。重定向的过程: 客户浏览器发送HTTP请求 ----》web服务器接收请求后发送302状态码和新的URL地址给客户浏览器 ----》
客户浏览器发现是302状态码响应,则重新发出一个HTTP请求,请求的URL就是服务器返回的新URL。在重定向中地址可以重定向到任意的URL,浏览器重新发出了请求那么request中的东西也是不再传递了,最明显的是地址栏的地址发生了改变。
记录一个细节:
使用Get/Post请求会将参数封装到HTTP的Request请求中,那么在页面转发后Request也被传递了,所以可以利用Post请求来在页面中传递参数!
例如:在jsp页面中设定隐藏的input标签,在标签的value中设置值。如下图所示,我们将selected 的value设置为true。
下面进行一次请求转发,通过Struts2的调试页面可以看到,在Request域中参数被传递了。