1. 区别:
在Form里面,可以使用post也可以使用get。它们都是method的合法取值。但是,post和get方法在使用上至少有以下几点不同:
1、Get方法通过URL请求来传递用户的输入。Get方法传递的参数和值在URL上用?name=value&name=value的形式显示。Post方法通过另外的形式。
2、通过get方法提交数据,可能会带来安全性的问题。比如一个登陆页面。当通过get方法提交数据时,用户名和密码将出现在URL上。如果登陆页面可以被浏览器缓存或其他人可以访问客户的这台机器。那么,别人即可以从浏览器的历史记录中,读取到此客户的账号和密码。所以,在某些情况下,get方法会带来严重的安全性问题。 建议在Form中,建议使用post方法。
3、显然Get方法局限性在于当要传的值很多是,就不便这样,否则URL可能超长度而出错。
2. 实例说明:
这是一个asp文件的代码,请将其拷贝到一个文本文件中,然后在“另存为”的时候将其存储为后缀名为 ".asp"的文件。然后将其放置到 wwwroot 目录下。打开IIS, 在“网站”的目录下找到这个文件,右击文件,浏览就可以看到页面了。
代码:
<%@language="VBScript" Codepage="936"%>
<html>
<head>
<title> 表单提交方式测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form method="post" action="<%=Request.ServerVariables("Script_Name")% >">
提交数据:
<input name="oStr" type="text">
<br>
提交方式:
<select name="select" οnchange="this.form.method=this.value">
<option value="Post" selected>Post</option>
<option value="Get">Get</option>
</select>
<br>
<input type="submit" name="Submit" value="Submit">
</form>
<%
if Request("Submit")<>"" then
Response.Write "通过"&Request.ServerVariables("Request_Method")&"方式提交的数据为:"
if Request.ServerVariables("Request_Method")="GET" then
Response.Write Request.QueryString("oStr")
else
Response.Write Request.Form("oStr")
end if
end if
%>
</body>
</html>
打开页面,我们可以看到地址为“http://localhost/testPost_Get.asp”(testPost_Get.asp)是文件的名字。这个时候默认的是“Post”方法,在文本框中输入一些内容,点击“Submit”,再看URL地址为:“http://localhost/testPost_Get.asp”没有变化,而页面下面显示一句话为:“通过POST方式提交的数据为: [你在文本框中输入的内容]”这时我们获取输入值的办法是, Response.Write.Request.Form("oStr"),其实post是根据HTTP Post机制将内容放置在 Http Header中,这个过程用户是不可见的。此时我们如果使用Response.QueryString("Ostr")的方法话就不能得到期望的值。因为在URL中根本就不存在名为Ostr的变量。
然后选择“Get”方法,点击“Submit”按钮。这个时候地址栏中的URL变成了,“http://localhost/testPost_Get.asp?oStr=test&select=Get&Submit=Submit”,很明显这里成对出现了,oStr,select,submit三个变量。这三个值就分别对应form中的三个控件(文本框,下拉选单,提交按钮),每个控件都跟着对应的值。如果使用.aspx页面并且没有禁止ViewState的话,那么你还可以看到对应的ViewState的值。这就说明了所有表单提交给服务器的值都是以键值对的形式明文提交的。既然是明文就涉及到一个安全性的问题,如果文本框中输入的是密码,那么在URL窗口中可以看到密码的内容。在ASP.NET环境中可不可以在Page_Load中对文本框的内容进行加密,那么在URL过程中就看不到明文的密码了。这个是无法实现的。因为当你点击提交按钮,页面立刻进行提交操作。而触发Page_Load的时候,是服务器收到了请求,然后对页面进行再次解析的时候才执行的。这其实根本就不是一个过程了。所以如果需要传输敏感数据的时候,就应该考虑使用Post方法而不是Get方法。