使用GET方式提交的表單遇到的問題


經常使用表單,一直使用的都是POST方式,POST將數據封裝到請求體中,相對於GET安全一點;而POST處理中文編碼問題也比GET簡單(GET需要將URL編碼,后台接受到后還需要解碼)。今天我想要使用GET方式提交表單,卻遇到了參數丟失的問題(姑且這樣稱呼這個問題吧),並不是GET方式表單提交的數據就會丟失,而是自己對表單理解的還不到位,使用錯誤。

一個GET方式提交的表單:

<form action="${pageContext.request.contextPath }/myServlet?name=lz" method="GET">
  <input type="text" name="password"/>
  <input type="submit" value="提交"/>
</form>

重點在於?號后面的name參數,我想當然的以為password的值會最加到后面,就如:

http://localhost:8888/11/myServlet?name=lz&password=123

但是事實上,真正的URL為:

http://localhost:8888/11/myServlet?password=123

沒錯,完全不管?號后面是否有值,直接將password追加到?號后面,所以我們在后台想要得到這個name的值,當然就得不到了。

而我們常用的POST方式會怎樣呢?

將method改為POST之后,再次提交,可以發現提交的URL:

http://localhost:8888/11/myServlet?name=lz

而password參數封裝在請求體中傳給后台,所以后台既可以得到name的值,也可以得到password的值,都沒有問題。

我們姑且將追加在?后面的參數稱之為查詢字符串,而將寫在input中的值稱之為表單數據。

注意:查詢字符串不能使用GET方式的表單進行提交,想要提交可以使用隱藏域的方式(作為表單數據),而POST沒有問題;表單數據不論使用哪種方式提交都是可以正確提交到后台的。

這個例子即使是比較極端的,但是如果有類似的需求還是需要注意一下。

 

既然這里說到表單,我再記錄一下如何使用表單發PUT或者DELET類型的請求,其實表單只支持GET或POST的請求,其method的方法選項也只有這兩種,如果我們使用RestFul風格的URl,就需要解決這個問題。

步驟:

1.在web.xml中配置HiddenHttpMethodFilter 這個Filter,其實就是這個Filter將POST請求轉變為PUT或是DELET,其實在頁面發的還是POST請求:

    <!--配置將POST轉換為PUT,DELETE的Filter  -->
    <filter>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <url-pattern>/*</url-pattern>
    </filter-mapping>

2.表單一定要使用POST請求,然后在表單中添加一個隱藏域:

    <%-- 因為使用PUT提交,所以需要一個隱藏域name=_method --%>
    <input type="hidden" name="_method" value="PUT"/>

隱藏域input的名應定要是_method,至此,就可以根據隱藏域value的值發出PUT或DELETE請求了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM