在ASP中访问和更新Cookies集合(2)

发表于:2007-06-30来源:作者:点击数: 标签:
Form和QueryString的差异 了解了访问各种ASP集合的技术以后,需要解决另一个问题是:Form和QueryString集合之间的差异是什么?假如准备使用ASP,毫无疑问应该清楚这种差异,但需要参考HTTP工作方式来重新认识,理解它们。 通过HTTP从Web 服务器 请求页面或其
     Form和QueryString的差异
  
    了解了访问各种ASP集合的技术以后,需要解决另一个问题是:Form和QueryString集合之间的差异是什么?假如准备使用ASP,毫无疑问应该清楚这种差异,但需要参考HTTP工作方式来重新认识,理解它们。
  
    通过HTTP从Web服务器请求页面或其他资源,有两个通用的方法。可使用GET方法直接获得资源,也可使用POST把值传给相应资源。GET方法是缺省的,可以看一下本章前面的一个HTTP请求的实例:
  
    7/8/99 10:27:16 Sent GET /Store/Download.asp HTTP/1.1
  
    假如把一个或多个成对的名称/值附在请求页面的URL后,就变成请求的查询字符串,且在QueryString集合中提供给ASP页面。单击Web页面、Email消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的Links或Favorites按钮,所有这些都要使用GET方法。
  
    因此,对这些动作中传递值给ASP的唯一方法是通过QueryString集合,把值附在URL后。
  
    出现在Request.QueryString集合中并被访问的值,与前面看到的Form集合实例中的工作方式相同。URL和查询字符串的结合:
  
    http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes
  
    可以采用如下方式访问在QueryString集合中提供的值:
  
  strFirstName = Request.QueryString(“FirstName”) ‘Return “Priscilla”
  strLastName = Request.QueryString(“LastName”) ‘Return “Descartes”
  strRaw = Request.QueryString
  ‘Return “FirstName=Priscilla&LastName=Descartes”
  
    窗体的GET和POST方法
  
    在一个页面内使用<FORM>段时,可以设置打开的FORM标记的METHOD属性值为“GET”或“POST”,缺省值为“GET”。假如使用“GET”或省略其属性,浏览器将该值绑定在页面所有控件上,成为一个查询字符串,且附在被请求页面的URL上。
  
    当这个请求到达Web服务器时,其值由ASP的Request.QueryString集合提供。然而,假如设置METHOD属性为“POST”,浏览器将值包装进发送服务器的HTTP报头中,通过Request.Form集合提供给ASP。
  
    通过来说,可以在所有的HTML窗体中使用POST方法。然而,浏览器或服务器的URL字符串长度存在一定的限制。因此,附有长的字符串可能会引起溢出和某些字符串的字符被截掉。同时,查询字符串出现在浏览器的地址栏和所有的保存的链接和收藏夹中。不仅如此,还显露了通过Web服务器时在HTTP请求中不想显示的值,它也可能出现你的服务器和其他路由服务器的日志文件中。在HTTP请求报头中的值很少是可见的,并且不出现在日志文件中。
  
    使用POST方法需要注意的小问题是,当用户重新下载<FORM>时,窗体的值将不再保留,其值为空且必须重新输入。然而,当附在URL上时,其值被存储为一个链接,将被保留,因此将出现在所有的URL与字符串结合的请求中,这或许是个优点也可能是个缺点,这根据应用而定(一些浏览器在客户端上能够在一定范围内自动保留一个页面上的值)。
  
    另一点是URL与查询字符串的结合体不能包含任何空格或其他非法字符,否则的话,Navigator和一些其他的浏览器将出现问题。非法字符是那些用来分隔URL和查询字符串的部分,例如“/”、“:”、“?”和“&”(IE能够自动将空格转换为正确的格式——加号“+”,但其他的非法字符不能处理)
  
    ASP中的cookie的使用
  
    在这一节我们将学习那些提供给ASP代码使用的集合、方法和属性的各种技术。
  
    1) cookie中存储用户的细节情况
  
    可以使用cookie来存储这两类值:当浏览器关闭时我们不想保存的值(例如用户的注册信息)以及在用户访问站点时要保留的值。在每种情况下cookie的值对于来自用户浏览器的每个页面请求的ASP都是可用的。
  
    然而,需要记住的是,cookie只有在对Cookie中的虚拟路径(path)内的页面发出请求时,才会发往服务器。缺省时,假如path的值在cookie中没有设置,则其值为创建cookie的页面的虚拟路径。为使一个cookie发往一个站点的所有页面,需要使用path=“/”。
  这里是个实例,从自定义的Login页面中,将用户的注册信息存贮在一个cookie中,由于没有应用有效期,cookie值仅在关闭这个浏览器这前保留:
  
  ...
  Request.Cookies(“User”)(“UID”) = “<% = Request(“UserName”) %>”
  Request.Cookies(“User”)(“PWD”) = “<% = Request(“Password”) %>”
  Request.Cookies(“User”).Path = “/adminstuff” ‘Only applies to admin pages
  ...
  
    现在,在用户从adminstuff目录或其子目录请求的每个页面中,都可以找到这个cookie。假如它不存在,可以将用户重定向到注册页面:
  
  If (Request.Cookies(“User”)(“UID”) <> “alexhomer”) _
  Or (Request.Cookies(“User”)(“PWD”) <> “secret”) Then
  Response.Redirect “login.asp?UserName=” & Request.Cookies(“User”)(“UID”)
  End If
  ...
  
    由于把cookie中的用户名放在Response.Redirect的URL查询字符串中,假如在口令输入时出现错误且希望用户不必重新键入用户名,可以在login.asp页面中使用它:
  
  <FORM ACTION=”check_user.asp” METHOD=”POST”>
  <INPUT TYPE=”TEXT” NAME=”UserName”
  VALUE=”<% = Request.QueryString(“UserName”) %>”><P>
  <INPUT TYPE=”SUBMIT” VALUE=”LOGIN”>
  </FORM>
  
    2) 修改现有的cookie
  
    可以使用ASP修改现有的cookie,但不能只修改cookie中的一个值。当更新一个在Response.Cookies集合中的Cookie时,现有的值将丢失。我们可以用如下代码创建一个cookie,可以使用:
  
  Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart
  Response.Cookies(“VisitCount”)(“LastDate”) = Now
  Response.Cookies(“VisitCount”)(“Visits”) = CStr(intVisits)
  Response.Cookies(“VisitCount”).Path = “/” ‘Apply to entire site
  Response.Cookies(“VisitCount”).Expires = DateAdd(“m”,3,Now)
  
    假如想要更新Visits和LastDate的值,必须先不需改变的所有值,然后重写整个的cookie:
  
  datDtart = Response.Cookies(“VisitCount”)(“StartDate”)
  intVisits = Response.Cookies(“VisitCount”)(“Visits”)
  Response.Cookies(“VisitCount”)(“StartDate”) = dtmStart
  Response.Cookies(“VisitCount”)(“LastDate”) = Now
  Response.Cookies(“VisitCount”)(“Visits”) = Cstr(intVisits)
  Response.Cookies(“VisitCount”).Path = “/”
  Response.Cookies(“VisitCount”).Expires = DateADD(“m”,3,Now + 1)且对于几乎所有的其他Response方法和属性,应该在写入任何内容(即打开<HTML>标记或任何文本或其他的HTML)到响应之前完成这个工作。
  
  
  

原文转自:http://www.ltesting.net