• 使用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请求了。

  • 相关阅读:
    C++并发编程实战---阅读笔记
    设计模式---命令模式
    图解HTTP(六)HTTP首部
    HTTP 状态码
    使用VS2012调试Dump文件
    如何设置C++崩溃时生成Dump文件
    boost::asio::io_service类
    boost::asio 同步&异步例子
    boost::bind
    c++并发编程之原子操作的实现原理
  • 原文地址:https://www.cnblogs.com/lz2017/p/7800114.html
Copyright © 2020-2023  润新知