精华内容
下载资源
问答
  • 1.3 表单提交数据的两种方式 1.3.1 两种方式 1、get 2、post 1.3.2 区别 1、外观上看 ​ get提交在地址上可以看到参数 ​ post提交在地址栏上看不到参数 2、安全性 ​ get不安全 ​ post安全 3、提交原理 ​ get...
  • 其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。 我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息...

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。

    我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

    <method> <request-URL> <version>

    <headers>

    <entity-body>

    协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

    但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。下面就正式开始介绍它们。

    application/x-www-form-urlencoded

    这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

    POST http://www.example.com HTTP/1.1

    Content-Type: application/x-www-form-urlencoded;charset=utf-8

    title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

    首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST[‘title’] 可以获取到 title 的值,$_POST[‘sub’] 可以得到 sub 数组。

    很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

    multipart/form-data

    这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。直接来看一个请求示例:

    POST http://www.example.com HTTP/1.1

    Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA

    Content-Disposition: form-data; name="text"

    title

    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA

    Content-Disposition: form-data; name="file"; filename="chrome.png"

    Content-Type: image/png

    PNG ... content of chrome.png ...

    ------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

    这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 –boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 –boundary– 标示结束。关于 mutipart/form-data 的详细定义,请前往 rfc1867 查看。

    这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

    上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

    application/json

    application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

    JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。

    Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:

    var data = {'title':'test''sub' : [1,2,3]};

    $http.post(url, data).success(function(result) {

        ...

    });

    最终发送的请求是:

    POST http://www.example.com HTTP/1.1

    Content-Type: application/json;charset=utf-8

    {"title":"test","sub":[1,2,3]}

    这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。

    当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章

    text/xml

    我的博客之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

    POST http://www.example.com HTTP/1.1

    Content-Type: text/xml

    <?xml version="1.0"?>

    <methodCall>

        <methodName>examples.getStateName</methodName>

        <params>

            <param>

                <value><i4>41</i4></value>

            </param>

        </params>

    </methodCall>

    XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

    展开全文
  • form表单提交数据编码方式和tomcat接受数据解码方式的思考 Tomcat浏览器Servlet.net读书   做javaweb开发段日子了,个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真很多)...
    
    
      做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。 
      form有2中方法把数据提交给服务器,get和post,分别说下吧。 
    (一)get提交 
      1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 
       
        对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc 
    (很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 
       2。服务器端(tomcat)是如何将数据获取到进行解码的。 
       第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接 
    Java代码  收藏代码
    1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")  

    还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置 
    Xml代码  收藏代码
    1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>  

    这样是让tomcat在获取数据后用指定的方式URL decoder,URL decoder的介绍在这里 


    (一)post提交 
    1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。 
      在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢? 
       在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。 
    2。服务器端(tomcat)是如何将数据获取到进行解码的。 
    如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。 

    我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。 
       有2篇文章推荐下,地址分别是 
    http://www.cnblogs.com/yencain/articles/1321386.html; 
    http://wanghuan8086.iteye.com/blog/173869
    分享到:  
    参考知识库
    Android知识库37704  关注 | 3152  收录
    React知识库3588  关注 | 393  收录
    人工智能基础知识库16607  关注 | 212  收录
    Java 知识库34998  关注 | 3748  收录
    评论
    13 楼 zchaony 2009-10-14  
    filter
    12 楼 czwlucky 2009-10-13  
    不知道大家有没有遇到这样的参数?
    http://aa.com?name&age=abc99
    这里是希望name&age是key,abc99是值,像这样的参数如何处理才正确呢?
    我现在遇到的问题出在webwork的使用上,它使用ognl自动组装参数到对象,但遇到这样的参数时会抛异常。
    11 楼 jieyuan_cg 2009-07-05  
    解决get方法提交参数乱码问题的关键:在页面response回去之前,如果页面中的url里面带有中文字符,就一定把这个中文字符进行编码。经过编码后的字符串都类似于%xy,不管浏览器用什么方法encode,都不会出错。
    10 楼 xukejun_BabyY 2009-06-16  
    谢谢分享,有了进一步的理解!!
    9 楼 jiongerher 2009-03-02  

    rubyeye 写道
    在程序里我们可以直接 
    Java代码  收藏代码
    1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")  




    请问楼主,我这样理解是否对: 



    tomcat的解码过程是  解码+解释 
    tomcat默认是在解码后用ISO8859-1进行解释。 无论给tomcat指定何种URIEncoding方式,实际上都能真确解码,只不过解码后的解释可能会应为设置的URIEncoding,而解释不正确。 

    所以request.getParameter("name")已经拿到了解码的结果,只是解释的不对。这样理解对吗?
    8 楼 asuperfly 2008-12-18  
    我的读书笔记:URLDecoder 
    用post很重要的在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/> 
    强烈建议使用post提交
    7 楼 rubyeye 2008-12-12  
    hyogacs 写道

    提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。

    从你的情况看,你的tomcat配置了URIEncoding="UTF-8",并且你可以肯定数据是通过GBK字符集URLEncoder的,那么用你试过的new String(request.getParameter("name").getBytes("UTF-8"),"GBK"))方式就能取到正确的数据。
    所以我也不好说了,你再检查下你的数据是通过GBK字符集URLEncoder的吗?
    6 楼 hyogacs 2008-12-11  
    提交的方式就是这样的:http://localhost:8080/Action?name=大连,这样里面的参数值“大连”默认是用GBK编码方式传到Action这个servlet的,我想知道怎么能在servlet里面得到“大连”这个值。get方法也许是我理解的不对,说的不好,总之意思就是跟在请求后面用?传递参数。
    5 楼 rubyeye 2008-12-07  
    hyogacs 写道

    有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz

    用你的方法取不到值是有点奇怪了,你的get方法是怎么带参数的呢?
    http://www.cnblogs.com/yencain/articles/1321386.html文章里面提到:
    http://localhost:8080/大连?name=大连
    上面的URL里面,前一个大连和后一个大连的URLEncoder是不一样,你是怎么带参数的呢?
    4 楼 hyogacs 2008-11-28  
    有个用GET传递参数的问题。想问一下LZ,就是我在tomcat配置了 URIEncoding="UTF-8",我在我的页面将我的中文信息用java.net.URLEncoder.encode("大连","UTF-8")编码后,在servlet里面request.getParameter("name")可以得到正确的中文信息大连。如果默认提交的话,我发现我的浏览器是用GBK编码后发给服务器的,即与java.net.URLEncoder.encode("大连","GBK")效果相同。现在的问题是我的tomcat配置文件不变的情况下,我能否在jsp页面不处理,即用默认的gbk编码方式传到servlet,而在servlet中取到正确的值呢?如果能,请问怎么取?(我试过new String(request.getParameter("name").getBytes("UTF-8"),"GBK")),取不到)。先提前谢谢lz
    3 楼 ddd0401 2008-11-22  
    对这问题一直一知半懂的,多谢分享,thinks
    2 楼 usherlight 2008-11-21  
    good.
    1 楼 chhg58 2008-11-21  
    对get post 又有了进一步的了解
    展开全文
  • Form表单提交数据的两种方式

    千次阅读 2016-11-16 22:43:23
    在JavaWeb项目中,表单提交数据的方式时常可见,方式有两种,其一,get方式;其二,post方式,下面简单的来说说这两种方式的区别。  1、从安全角度来说,当表单数据以get方式提交时,提交的数据会显示在浏览器的...

        在JavaWeb项目中,表单提交数据的方式时常可见,方式有两种,其一,get方式;其二,post方式,下面简单的来说说这两种方式的区别。

        1、从安全角度来说,当表单数据以get方式提交时,提交的数据会显示在浏览器的地址栏,这样不利于安全传输数据。例如,如果用户将登陆某个银行系统界面,需要输入用户名及密码,以这种方式提交数据,用户的密码就会显示在浏览器上,极不利于数据的保密;但post方法则不会出现这样的情况。

         2、从提交的内容大小来说,以get的方式可以提交的内容大小最大为2KB,而post方式可以提交的内容不受限制,但最好不要超过64KB

         3、从响应速度上说,get要比post方式的响应速度快,以前者的方式提交数据给服务器后,服务器会立即响应,但是后者提交的数据的请求,会形成一个请求队列,即不一定立刻响应,也不一定会响应。

    展开全文
  • Form表单提交数据的几种方式

    千次阅读 2019-04-11 17:54:04
    Form表单提交数据的几种方式 一、submit提交 在form标签中添加Action(提交的地址)和method(post),且一个submit按钮(<input type=’submit’>)就可以进行数据的提交,每一个input标签都需要...

    Form表单提交数据的几种方式

    一、submit提交

    在form标签中添加Action(提交的地址)和method(post),且有一个submit按钮(<input type=’submit’>)就可以进行数据的提交,每一个input标签都需要有一个name属性,才能进行提交。

    <form action=’http://www.123.com/postValue’ method=’post’>

    <input type=’text’ name=’username’ />

    <input type=’password’ name=’password’/>

    <input type=’submit’ value=’登陆'/>

    </form>

    当点击登陆时,向服务端发生的数据是:username=username&password=password.

    这种默认的提交方式,一般会进行页面的跳转(不成功时跳转到当前页面)。而有时候我们是对弹出框进行数据提交的,希望提交成功则关闭弹出框并刷选父页面,失败则提示失败原因,且弹出框不关闭。此时可以采用Ajax进行数据提交.

    二、Ajax提交form表单

    $('#documentForm').submitForm({
                url: "/Document/SubmitDocumentCreate",
                dataType: "text",
                callback: function (data) {
                    endFileUpload();
                    data = eval("(" + data + ")");
                    alert(data.Content);
                    if (data.Result > 0) {
                        location.href = data.Redirect;
                    }
                },
                before: function () {
                    startFileUpload();
                    var errMsg = "";
                }
            }).submit();

    此时可以在callback函数中对请求结果进行判断,然后执行不同的动作(页面跳转或刷选数据、提醒错误都可以)

    三、Easyui的form插件

    通过easyui的form插件也可以达到上面的目的。

    $('#ff').form('submit', {

    url:...,

    onSubmit: function(){

    //进行表单验证

    //如果返回false阻止提交

    },

    success:function(data){

    alert(data)

    }

    });

    四、form表单提交附件

    需要设定form的enctype="multipart/form-data"并且添加<input type=’file’>

    而且附件只能通过submit方法进行提交,

    展开全文
  • 1.首先说下客户端(浏览器)form表单用get方法是如何将数据编码后提交给服务器端吧。    对于get方法来说,都是把数据串联在请求url后面作为参数,如:http://localhost:8080/servlet?msg=abc  (很常见...
  • 在基于springmvcweb项目中,后台获取前台提交的数据方式有多种。 1、在from中action写提交的路径,然后再inputname写参数名称。 ...
  • form表单提交数据编码方式和tomcat接受数据解码方式  做javaweb开发段日子了,个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真很多),都是一大堆介绍如何解决此类乱码问题...
  • 客户端表单提交数据方式与服务器获取数据

    万次阅读 热门讨论 2013-06-16 20:29:37
    表单提交数据的两种方式  表单form的提交两种方式,一种是get的方法,通过超级链接后面的参数提交过来,一种是post ,通过Form表单提交过来。 post方式: method="post" action="login.aspx"> 用户名...
  • form2中方法把数据提交...1.首先说下客户端(浏览器)form表单用get方法是如何将数据编码后提交给服务器端吧。   对于get方法来说,都是把数据串联在请求url后面作为参数,如:http://localhost:8080/s
  • Jquery AJAX提交表单有两种方式,一是url参数提交数据,二是form提交(和平常一样在后台可以获取到Form表单的值)。在所要提交的表单中,如果元素很多话建议用第二种方式进行提交,当然你要是想练练“打字水平”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,361
精华内容 944
关键字:

表单提交数据的方式有