原理性上的區別css
HTTP定義了與服務器交互的不一樣方法,最基本的方法有4種,分別是GET、POST、PUT、DELETE。URL全稱是資源描述符,咱們能夠這麼認爲:一個URL地址,它用於描述網絡上的一個資源,而HTTP的GET、POST、PUT、DELETE就對應着對這個資源的查、改、增、刪4個操做。因此GET和POST的第一個區別:GET通常用於獲取/查詢資源信息,POST通常用於更新資源信息。web
一、根據HTTP規範,GET用於信息獲取,並且應該是安全和冪等的,安全和冪等的意思是:數據庫
(1)所謂安全意味着該操做用於獲取信息而不是修改信息,換句話說,GET請求通常不該該產生反作用,也就是說,它僅僅是獲取資源信息,就像數據庫查詢同樣,不會修改、增長數據,不影響資源的狀態瀏覽器
(2)所謂冪等意味着對同一個URL的多個請求應該返回相同的結果緩存
好比一個新聞網站,讀者打開一個連接獲取新聞應該使用GET實現安全
二、根據HTTP規範,POST表示可能修改服務器上的資源的請求,好比一個新聞網站,讀者對新聞資源發表的評論應該經過POST實現,由於在評論提交以後站點的資源已經不一樣了,或者說是資源被修改了服務器
另外還有很重要的一點,從瀏覽器發起一次HTTP請求:網絡
一、一些靜態資源好比.css文件、.js文件是不多發生變化的,讓這些文件放在瀏覽器緩存裏面,請求的時候從瀏覽器緩存裏面拿這些資源而不去服務器上拿,能夠有效地減輕服務端的壓力,加快瀏覽器的訪問速度jsp
二、服務器響應完可能將一些資源放到客戶端的瀏覽器緩存中post
而只有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配置就不放了,都會。
一、URL請求的方式爲GET方式。我從瀏覽器導航欄中輸入"http://localhost:8080/TestWeb/submitMethod",看一下打印結果:
Enter GetAndPostServlet.doGet() a = null
二、表單默認提交方式爲GET方式。個人jsp頁面爲:
...
<body> <form action="submitMethod"> <input type="submit" value=" 提交 " /> </form> </body>
...
控制檯打印的內容爲:
Enter GetAndPostServlet.doGet() a = null
三、表單的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
四、表單提交,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中。