GET和POST的區別

原理性上的區別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" />男&nbsp;&nbsp;&nbsp; <input type="radio" name="sex" value="1" />女<br /> 愛好:<input type="checkbox" name="hobby" value="0" />打球&nbsp;&nbsp;&nbsp; <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中。

相關文章
相關標籤/搜索