HTTP定义了与做事器交互的不同方法,最基本的方法有4种,分别是GET、POST、PUT、DELETE。URL全称是资源描述符,我们可以这么认为:一个URL地址,它用于描述网络上的一个资源,而HTTP的GET、POST、PUT、DELETE就对应着对这个资源的查、改、增、删4个操作。以是GET和POST的第一个差异:GET一样平常用于获取/查询资源信息,POST一样平常用于更新资源信息。
1、根据HTTP规范,GET用于信息获取,而且该当是安全和幂等的,安全和幂等的意思是:
(1)所谓安全意味着该操浸染于获取信息而不是修正信息,换句话说,GET要求一样平常不应该产生副浸染,也便是说,它仅仅是获取资源信息,就像数据库查询一样,不会修正、增加数据,不影响资源的状态
(2)所谓幂等意味着对同一个URL的多个要求该当返回相同的结果
比如一个新闻网站,读者打开一个链接获撤消息该当利用GET实现
2、根据HTTP规范,POST表示可能修正做事器上的资源的要求,比如一个新闻网站,读者对新闻资源揭橥的评论该当通过POST实现,由于在评论提交之后站点的资源已经不同了,或者说是资源被修正了
其余还有很主要的一点,从浏览器发起一次HTTP要求:
1、一些静态资源比如.css文件、.js文件是很少发生变革的,让这些文件放在浏览器缓存里面,要求的时候从浏览器缓存里面拿这些资源而不去做事器上拿,可以有效地减轻做事真个压力,加快浏览器的访问速率
2、做事器相应完可能将一些资源放到客户真个浏览器缓存中
而只有GET办法才能从缓存中存、取资源,POST办法则不可以。
事实说话:表象上的差异
说完事理性的差异,我们用事实说话,从表象上看一下GET和POST的差异,首先我写一个Servlet:
public class GetAndPostServlet extends HttpServlet{ / 序列化 / private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(\公众Enter GetAndPostServlet.doGet()\"大众); String str = request.getParameter(\"大众a\"大众); System.out.println(\"大众a = \公众 + str); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(\"大众Enter GetAndPostServlet.doPost()\"大众); String str = request.getParameter(\"大众a\"大众); System.out.println(\"大众a = \公众 + str); }}
web.xml里面的Servlet配置就不放了,都会。
1、URL要求的办法为GET办法。我从浏览器导航栏中输入\公众http://localhost:8080/TestWeb/submitMethod\公众,看一下打印结果:
Enter GetAndPostServlet.doGet()a = null
2、表单默认提交办法为GET办法。我的jsp页面为:
...<body> <form action=\公众submitMethod\公众> <input type=\"大众submit\"大众 value=\公众 提交 \"大众 /> </form></body>...
掌握台打印的内容为:
Enter GetAndPostServlet.doGet()a = null
3、表单的action中?后面带了参数,只有POST办法可以取到。jsp页面不变,先让表单以GET办法提交,运行结果为:
Enter GetAndPostServlet.doGet()a = null
如果我把表单提交办法改为POST的:
...<body> <form action=\"大众submitMethod?a=1\"大众 method=\公众post\公众> <input type=\公众submit\"大众 value=\"大众 提交 \"大众 /> </form></body>...
后台打印的结果为:
Enter GetAndPostServlet.doPost()a = 1
4、表单提交,GET办法会把所有控件值都带在action后面,纵然是password,也是明文形式的,POST办法则不会。我把jsp修正一下:
...<body> <form action=\"大众submitMethod?a=1\公众 method=\公众GET\公众> 姓名:<input type=\公众text\"大众 name=\"大众name\"大众 /><br /> 密码:<input type=\"大众password\公众 name=\"大众password\"大众 /><br /> 性别:<input type=\公众radio\公众 name=\"大众sex\公众 value=\"大众0\"大众 />男 <input type=\"大众radio\公众 name=\"大众sex\公众 value=\"大众1\公众 />女<br /> 爱好:<input type=\公众checkbox\公众 name=\"大众hobby\"大众 value=\"大众0\"大众 />打球 <input type=\"大众checkbox\"大众 name=\公众hobby\公众 value=\公众1\"大众 />唱歌<br /> <input type=\"大众submit\公众 value=\"大众 提交 \"大众 /> </form></body>...
页面上的表单这么写:
点一下提交,导航栏里面的URL为\公众http://localhost:8080/TestWeb/submitMethod?name=aaa&password=bbbccc&sex=0&hobby=0&hobby=1\"大众,看到纵然是密文的密码,在URL里面也变成了明文了,原有的\"大众a=1\"大众并不涌如今URL里面。
把表单给成POST的,点提交,导航栏里面的URL为\"大众http://localhost:8080/TestWeb/submitMethod?a=1\公众,action里面怎么样还是怎么样。
从这个角度说,说POST提交表单比GET办法提交表单更安全也是有道理的,由于GET办法提交的数据,表单参数是在URL中的,而POST办法提交的数据,表单参数是在要求体中的,可以这么证明这一点,F12查看要求信息,POST办法提交的时候:
Content-Length即要求体,现在是46,checkbox我只选一个的时候,Content-Length变成了35,而GET办法提交数据则没有Content-Length这个头信息,证明了POST办法提交的表单参数存放在HTTP BODY中。