博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表单初试
阅读量:6279 次
发布时间:2019-06-22

本文共 3500 字,大约阅读时间需要 11 分钟。

hot3.png

表单在我们的日常生活中十分常见,通常情况下,我们都是将前端页面中填写的数据上传到服务器,之后,由服务器端的后台程序对用户提交的这些数据进行分析和处理。上传数据的方式主要有get和post两种。

get方式

下面我们以html作为编程工具,实现一个get方式上传数据的表单

无标题文档
用户名:
密码:

运行效果如下,

201042_Vplx_2392809.png

提交之后的浏览器地址栏出现的是这样的字符串,说明get方式传递数据给php后台程序处理是不安全的。

file:///F:/program/login.php?username=dongchao&password=123456

post方式

因此,后面我们将get改成了post做了一个新的表单。

无标题文档
用户名:
密码:
性别:
 先生
 小姐
爱好:
 玩游戏
 听音乐
 旅游
 看书
个人简介:
请输入你的个人信息
 

我使用的编辑器软件是Dreamweaver8,使用firefox浏览器运行的效果如下,

210335_Gcnl_2392809.png

提交表单之后,浏览器的地址栏显示如下

file:///F:/program/login.php

可以明显的看到post方法上传数据的时候,不会明文传递用户名和密码等敏感信息。

get与post的区别

一、问题的提出  

 
     
     
    
    

注意到表单中action:getPostServlet/getPost.do?param4=param4

这个action带有一个参数param4,

如果用get方法提交,后台无法接收到这个参数;

如果用post方法提交,后台就可以接收到这个参数。

问题原因的简单解释:

用get方法提交的url显示如下:

http://localhost/mywebapp/getPostServlet/getPost.do?pram1=param1&pram2=param2&pram3=param3&button1=submit也就是说method为get时action自己后边带的参数列表会被忽视,,后台无法接收到这个参数,只能得到表单中的参数;

用post方法提交的url显示如下:

http://localhost/mywebapp/getPostServlet/getPost.do?param4=param4

也就是说post方式提交表单,参数分为两部分:一部分是action中的参数放在地址栏;另一部分是表单中的参数放在请求的头中;所以所有的数据后台全部能获得。

对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。Request从几个集合取数据是有顺序的,从前到后的顺序依次是 QueryString,Form,最后是ServerVariables。Request对象按照这样的顺序依次搜索这几个集合中的变量,如果有符合的就中止,后面的就不管了。

二、定义

form元素的method属性用来指定发送form的http方法;

使用get时,form数据集被附加到form元素的action属性所指定的URL后面;

使用post时,form数据集被包装在请求的body中并被发送。

使用get提交方式,生成URL:user.do?loginId=abc

get仅仅是拼接一个URL,然后直接向服务区请求数据,需要提交给服务器的数据集包含在URL中。

使用post提交方式,生成URL:user.do

post会把form的数据集,即loginId=abc这个键值对包装在请求的body中,发给服务器,然后向服务器请求数据。

三、区别

1、安全性

如果用get提交一个验证用户名和密码的form,一般认为是不安全的,因为用户名和密码将出现在URL上,进而出现在浏览器的历史记录中。

显然,在对安全性有要求的情况下,应该使用post。

2、编码

get只能向服务器发送ASCII字符,而post则可以发送整个ISO 10646中的字符。

get和post对应的enctype属性有区别。enctype有两个值,默认值为application/x-www-form-urlencoded(在发送前编码所有字符)

另一个是multipart/form-data(用于文件上传)只能用于post。

3、提交数据的长度。

IE将请求的URL长度限制为2083个字符,从而限制了get提交的数据长度,如果URL超出了这个限制,提交form时IE不会有任何反映。

4、缓存

由于一个get得到的结果直接对应到一个URL,所以get的结果页面有可能被浏览器缓存,而post一般不能。

5、引用和SEO 

可以用一个URI引用一个get的结果页面,而post的结果则不能,所以必然不能被搜索引擎搜到。

最本质的区别:

1、Get是用来从服务器上获得数据,而post是用来向服务器上传递数据

如果采用Post方法,浏览器将会按照下面两步来发送数据。

首先浏览器将action属性中指定的表单处理服务器建立联系,一旦建立连接之后,浏览器就会按分段传输的方法将数据发送给服务器。

在服务器端,一旦Post样式的应用程序开始执行时,就应该从一个标志位置读取参数,而一旦读到参数,在应用程序能够使用这些表单值以前,必须对这些参数进行解码,用户特定的服务器会明确指定应用程序应该如何接受这些参数。

采用Get方法:

浏览器会直接与表单处理服务器建立连接,然后直接在一个传输步骤中发送所有的表单数据,然后直接在一个传输步骤中发送所有的表单数据。

2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。

四、正确的使用get和post 

当且仅当form是幂等的时候,使用get。 

幂等:多次相同的请求产生的副作用,和一次请求的副作用相同。 

如果提交请求纯粹只是从服务器端获取数据而不是进行其他操作,并且多次提交不会有明显的副作用,应该使用get。 

比如:搜索引擎的查询(http://www.google.com/search?q=abc)和分页(user.do?page=1) 

如果提交这个请求会产生其他操作和影响,就应该使用post。 

比如:修改服务器上数据库中的数据;发送一封邮件;删除一个文件等 

另一个要考虑因素是安全性。 

若符合下列任一情况,则用post方法: 

a.请求的结果有持续性的副作用,例如:数据库内添加新的数据行。 

b.若使用get方法,则表单上收集的数据可能让URL过长。 

c.要传送的数据不是采用ASCII编码。 

若符合下列任一情况,则用get方法: 

a.请求是为了查找资源,html表单数据仅用来搜索。 

b.请求结果无持续性的副作用。 

c.收集的数据及html表单内的输入字段名称的总长不超过1024个字符。 

五、浏览器差异 

IE6:URL长度限制为2083个字符;post之后,刷新页面不会自动重新post数据,会出现警告。 

IE7和IE6相同。 

Firefox:刷新页面不会自动重新post数据会出现警告。

post和get容易忽视的一点差别:

就是当method为get时,action属性中URL后面的参数是忽视的。

例如:

action=insert.jsp?name=tobby method=get

当我们提交之后真正的url中是没有name=tobby的,他会根据表单中的内容重新组装成一个url的,假如form中有一个文本框,

,那么,提交表单后,url会变成insert.jsp?addresswuhan.

转载于:https://my.oschina.net/donngchao/blog/552026

你可能感兴趣的文章
Android——4.2 - 3G移植之路之 APN (五)
查看>>
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>