post get
post方式相比get安全,携带数据更大,我准备所有数据都用post方式获取,这样好吗?
如题,准备spa[single page application]化, 全站的数据都用ajax调用, 然后全部用post方式提交/获取数据,这样做有什么不好吗?
6 个回答
1、多数浏览器对于POST采用两阶段发送数据的,先发送请求头,再发送请求体,即使参数再少再短,也会被分成两个步骤来发送(相对于GET),也就是第一步发送header数据,第二步再发送body部分。HTTP是应用层的协议,而在传输层有些情况TCP会出现两次连结的过程,HTTP协议本身不保存状态信息,一次请求一次响应。对于TCP而言,通信次数越多反而靠性越低,能在一次连结中传输完需要的消息是最可靠的,尽量使用GET请求来减少网络耗时。如果通信时间增加,这段时间客户端与服务器端一直保持连接状态,在服务器侧负载可能会增加,可靠性会下降。
2、GET请求能够被cache,GET请求能够被保存在浏览器的浏览历史里面(密码等重要数据GET提交,别人查看历史记录,就可以直接看到这些私密数据)POST不进行缓存。
3、GET参数是带在URL后面,传统IE中URL的最大可用长度为2048字符,其他浏览器对URL长度限制实现上有所不同。POST请求无长度限制(目前理论上是这样的)。
4、GET提交的数据大小,不同浏览器的限制不同,一般在2k-8K之间,POST提交数据比较大,大小靠服务器的设定值限制。
5、全部用POST不是十分合理,最好先把请求按功能和场景分下类,对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的2k范围内,这样的情况使用GET。其他地方使用POST。
6小时前更新 |
南山磨刀9520小时前回答 |
-
1南山磨刀 · 16小时前回复依云:
这个问题我还是希望深入讨论下 我认为你说的应该是在理论上HTTP请求最多需要建立一次TCP连接,如果第一次TCP连接后,由于网络问题中断或其他原因,我认为浏览器厂商会重新建立连接(这只是我的猜想)或在者同源策略的影响重新建立连接?我刚才在IE下用Wireshark观察了些网站,发现有时候出现两个TCP连接。 刚才又查询了下RCF 确实只能建立不超过2个TCP,连接以避免拥塞 http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion. 还有IE文档 http://support.microsoft.com/kb/183110/en-us MaxConnectionsPerServer REG_DWORD (Default 2) Sets the number of simultaneous requests to a single HTTP 1.1 Server MaxConnectionsPer1_0Server REG_DWORD (Default 4) Sets the number of simultaneous requests to a single HTTP 1.0 Server 1.1协议2个,1.0协议4个 对于我们使用最多的IE,有这样一个注册表设置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings 。 在我印象中(描述不完全正确)。浏览器在网络延迟、丢包,服务端响应时间太长的情况下,客户端重发POST的数据到服务器。如果浏览器有一次传输中只收到HTTP的Header,但Body没有接受到,服务端发送请求错误码后才知道客户端没有重新POST。浏览器与服务器之间的协调是什么样的?这个过程能描述么?是连结超时,再等它重发数据,再超时,再重发么?那和WEB服务侧定义的“超时”如何协调呢?
-
1
-
1南山磨刀 · 18小时前回复依云:
感谢批评指正,我描述不正确,对与RFC没有进行核实。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2 The HTTP protocol does not place any a priori limit on the length of a URI.
- 更多评论 (5条)
post方式相比get安全
你从哪个学校的哪个老师那里学到的这个理论?
携带数据更大
这个是对的,POST 携带数据大,而且,不仅仅是大,某些数据只能用 POST 方法「携带」,比如 file。
我准备所有数据都用post方式获取,这样好吗?
GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「等幂」的,在这一点上,GET 被认为是「安全的」。
补充一条:GET 的内容可以被浏览器缓存,而 POST 的数据不可以。
GET
Requests a representation of the specified resource. Requests using GET should only retrieve data and should have no other effect. (This is also true of some other HTTP methods.)
POST
Requests that the server accept the entity enclosed in the request as a new subordinate of the web resource identified by the URI. The data POSTed might be, as examples, an annotation for existing resources; a message for a bulletin board, newsgroup, mailing list, or comment thread; a block of data that is the result of submitting a web form to a data-handling process; or an item to add to a database.
所以get主要用来“读取”数据,而“post”主要用于修改、插入数据。
不过就你这个问题来说,用post没有什么不好的。
xuelang1.4k5天前回答 |
POST可以防止一些跨站攻击。 比如像
http://www.wooyun.org/bugs/wooyun-2010-016317 http://www.wooyun.org/bugs/wooyun-2010-024150
但是,浏览器完成一个POST请求需要消耗更多的等待和资源。 如果某个请求数据不涉及到业务安全,建议GET完成。而XSS跨站等问题,可以用动态token解决。
4天前更新 | ![]() |
冰纷Ent994天前回答 |
-
1Gildor · 23小时前
POST和动态token不是应对XSS而是CSRF的吧
-
1冰纷Ent · 2天前
POST给服务器的数据,根据ietf标准(http://tools.ietf.org/html/rfc2616#section-8.2)和w3c标准(http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html)会突破HTTP缓存并无视304(Not Modified)HTTP状态。而且POST的HTTP协议定义中是在URL参数发出后再次发出的,而区别URI/POST参数中间有间隔符,并有等待时间,所以消耗的资源比GET要多。。。
- 更多评论 (1条)
“滥用”POST
不一定妥当:程序overhead会成大问题。
举个例子,我有一个 Objective-C CGI 库,如果 CGI 环境变量里面没有指定存在 POST 数据,库里面就直接把 stdin 关了,而不去等待数据。这样的话效率会高很多,还省内存(不用创建输入数据对象了)!
Maxthon T. Chan531天前回答 |
其实,亲,post数据是二段提交的!只要你和团队能适应post的各种规则,用吧,这年头乱用方法的人多了去
实话,没有什么不好,只要你坚持,,,然后遇到复杂情况,或是自个儿手误将整个数据库删除时,才能知道为毛 RESTful 会这么蛋疼的区分5~6种情况要求不同的请求操作,,,
RESTful 目前来看还是非常合理的
POST所谓的安全就是可以防CSRF, 至于传输安全,还是要靠https