• 如何用session对象来取代cookies建立基于状态的应用


    摘 要:随着Internet应用技术普及,动态交互过程中带来了如何在信息传递中保存某些数据信息的问题。本文讲述了如何用ActiveX组件中的session对象来实现整个应用过程中用户进程的状态。
    关键词:ActiveX服务器 session对象 cookie

    How to Build Status-based Applications With Session Objects Instead of Cookies

    Zhu Tiefeng
    (Automation School, Shanghai University Shanghai 200435)

    AbstractWith development of Internet application technology, occurs such a problem: how to keep track of certain data in the course of dynamic interaction. This paper gives an introduction to tracing the status of the user's process in the course of the whole application by using session objects of ActiveX components.
    Keywords:ActiveX server session object 
    cookie▲

    一、前 言

      随着Internet的普及,许多企业、个人通过Internet网浏览、查询和发布信息。解决用户和服务器上的动态交互操作问题,使用传统的CGI和ISAPI等方式实现较复杂。Microsoft的IIS3.0(Internet Information Server 3.0)中提出了ASP(Active Server Pages)的技术,为Web的动态交互式访问提供了一种非常简单方便的新途径。

    二、ASP的内置对象

      ASP包括无需考虑用户端的类型的可在服务器端运行的脚本。ASP本身就是来源于相当数量的标准服务端ActiveX元素。ActiveX服务器提供了几个对象使建立Web应用更加容易。在一个高的层次上,request对象解释来自用户的输入,request对象将信息发送回用户,session对象保留整个应用过程中用户过程的状态,Application对象允许你将信息传送给应用ActiveX服务器的所有用户。
      在ActiveX服务器中session对象允许Web就用程序的开发者用比以前容易得多的方法建立起基于状态的应用。当编写第一个Web应用程序时,大多数开发者都马上对Web开发无状态的性质造成的限制留下了较深的印象。那就是说,当用户通过链接或发送一张表来调用一个程序时,程序并不知道现在以及几秒钟以前用户都做了些什么。

    三、Cookie技术如何保存状态信息

      Cookie正是被用来解决这个问题的。网点或服务器应用的编写者能够保存有关用户邮件的正确信息。比如说,如果用户正在浏览一个Web商业站点,并不停地购买商品,正常情况下,你应该允许他们在一个虚拟购物篮中保存他们购买的商品。在ActiveX服务器之前,没有使用Cookie要做到这点很困难。它要求向Web站点的每个页传递一个参数,通常是指示一次会话的ID号。这可以通过用包含会话标识的隐含字段生成所有的表或传递的会话标识作为页上每个URL的参数动态地生成所有的页的方法来完成。不过,要实现这一点无论用什么方法都是不容易的。
      Cookie极大地解决了这个问题,因为必要的信息(例如会话标识)可以存储在用户的机器中。Cookie变量(例如:”session”)在需要的时候可以被服务器查询。为实现一个购物篮(shopping basket)每次用户选购了一种产品,它可以用记录的形式将所有产品信息存储到购物篮表中,并以”session”作为字段标志。当用户准备结帐时,单击checkout链接,checkout服务器应用程序查询它们的”session”Cookie以决定session表中哪一行应该被检索、显示、求和以便用户确定他的采购。当然,这并不是实现购物篮的唯一方法。因为有Cookie可用,实际上你可以将每个产品的ID保留在一个名叫”ordered”的单独的Cookie中。当购买者(用户)结帐时,根据与Cookie相连的产品ID就可以从货物表中检索出记录。

    四、Cookie技术存在的问题及seession解决方法

      这里有一个问题,不是所有的浏览器都支持Cookie.AcriveX服务器的session对象解决了这个难题。如果用户的浏览器可以使Cookie,它就用Cookie来实现在用户的整个会话过程中保存各个变量值的功能。特别地,ActiveX服务器的脚本解释器寻找来自用户的以HTTP开头的会话标志,Cookie(session ID Cookie)如果不存在,并且用户浏览器支持Cookie,它就会生成一个唯一的ID并设置session ID Cookies。
      如果用户的浏览器不能使用Cookies,ActiveX服务器就要做更多的工作。ActiveX服务器引擎将回送给用户的session ID添加到页上所有的URL中。为了使session对象在没有Cookie的浏览器中为用户维护整个应用的状态,在应用(站点)上的所有页必须是.asp文件。为保证ActiveX服务器引擎修改URL以便在每种链拉模式下都包含session ID这个要求是很有必要的。
      session对象允许你把任何想用于用户的变量名和值通过你的站点存到用户的路径下。你可以根据你的选择命名session变量。例如为保存用户购买的产品数,你可能要创建一个session(“ItemCount”)变量。

    五、应用实例

      下面一个用于演示ActiveX服务器能力的例子一一购物篮实例,通过它可以对如何运用session对象有一定了解。在该例中大量应用了session对象,即有保存数据库连接,也有购物的信息如购物数量和物品ID,如果用cookie技术实现较困难且要求用户浏览器支持cookie。
    程序一、Basket.asp(购物篮中的所购商品页)

    t47-1.gif (5277 bytes)

    <script language="vbscript"runat="server">
    </script>
    <%if isobject(session("conn"))then‘是否数据库已连接
      set conn=session("conn")
      else
      set conn=server.createobject
      ("adodb.connection")
      ret=conn.open("shopping","sa","")
      session("conn")=conn
    end if
    if not isempty(session("items")) then
      nitems=session("items")
    else
      nitems=0
      session("items")=items
    end if
    if not isempty(session("basket"))then
    ‘是否定义了购物篮
      basket=session("basket")
    else
    dim basket(100,2)‘定义二维数组存储商品id号和商品数量
      session("basket")=basket
    end if
    if isnull(basket(1,1))then
      nitems=0
    end if
    if request("partid)<>""then
      i=0
      do while
      request("partid")<>basket(i,1)and
      (i<nitems+1)
      i=i+1
      loop
      basket(i,2)=basket(i,2)+1
      session("basket")=basket
    if i=nitems+1 then
      nitems=nitems+1
      session("items")=nitems
      basket(nitems,1)=request("partid")
      ‘存放购物的货物ID
    basket(nitems,2)=1   ‘存放购物的数量
      session("basket")=basket
      end if
    end if
    select case left(request("action"),2)
    case"重新" ‘根据顾客改动的数量重新计算部分和
      for i=1 to nitems
      if isnumeric(request("quantity"
      &cstr(i))) then
      basket(i,2)=request("quantity"&cstr(i))
    else
      basket(i,2)=1
      end if
      next-

      session("basket")=basket
      session("items")=nitems
    case"继续" ‘回到顾客正在购物的货物清单
      for i=1 to nitems
      if isnumeric(request("quantity"&cstr(i)))
    then
      basket(i,2)=request("quantity"&cstr(i))
      else
      basket(i,2)=1
      end if
      next
      session("basket")=basket
      Response,Redirect"shoppinglist.asp"
    case"取消"  ‘消除购物篮并使顾客返回到购物区
      nitems=0
      session("items")=nitems
      Response,Redirect"shoppinglist.asp"
    case"购买" ‘重新计算部分和并解除与页的连接以完成购物,在basket2.asp页中购货者提供支票和购物信息。
      for i=1 to nitems
    if isnumeric(request("quantity"&cstr(i)))
    then
      basket(i,2)=request("quantity"&cstr(i))
    else
      basket(i,2)=1
    end if
    next
      session("basket")=basketResponse,Redirect"basket2.asp"
    case else
    end select
    %>
    <html><head>
    <meta NAME="GENERATOR" Content="Mictosoft
    FrontPage 3.0">
    <title>shopping basket</title>
    <meta name="Microsoft Theme"content="nature
    011"></head>
    <body background="nabkgnd.jpg"
    bgcolor="#FFFFFF"text="#000000"
    link="#FF6600"vlink="#660099"
    alink="#ooccoo">
    <form action="basket.asp?"method="POST">
    </font>
    <table border="1" id="TABLE1" width="625"
    cellspacing="3" bordercolorlight="#CC9966"
    bordercolordark="#996600">
      <tr><th width="264">商品名称</font></th>
      <th width="82">单价(元)</font></th>
      <th width="84">折扣(%)</font></th>
      <th width="300">商品说明</font></th>
      <th width="106">数量</font></th>
      </th>
    <&subtotal=0
    for i=1 to nitems
    set
    conn=server.CreateObject("adodb.connetion")
    ret=conn.Open("shopping","sa","")
    cmd="select * from inventoryitems where
    partid='"&basket(i,1)&"'")
    set re=conn.execute(cmd)%>
    <tr><td
    width="264"><%=rs("productname")%></font></td>
    <td width="82"><%=rs("price")%></font>
    </td>
    <td
    width="84"><%=rs("discount")%></font>
    </td>
    <td
    width="300"><%=rs("description")%></font><
    /td>
    <td width="106"
    <input name=
    "<%Response.Write"quantity"&cstr(i)%>"
    value="<%=basket(i,2)%>"size="9">
    <%
    subtotal=subtotal+(cdbl(basket(i,2))*cdb1(re("price")))
    next%>
    <!--subtotals row--> </font></td></tr>
    <tr><td width="264"
    colspan="3"><big><big><strong>-------------
    ----></strong></bit></big></font></td>
      <td width="82"><big><strong>总计:
    </strong></big></font></td>
    <td width="90"><%=subtotal%></font></td>
    </tr>
    <tr><td width="270"colspan="5">
    <input type="submit"name="action" value="重新计算"><input type="submit"name="action" value="继续购物"><%if nitems>0 then %><input type="submit" name="action" value="购买"><%end if%><input type="submit"name="action"value="取消"></font></td></tr></table>
    </form></font>
    </body>
    </html>
    程序二、shoppinglist.asp(供购物选择商品用的页)

    t48-1.gif (3522 bytes)

    <html><head><meta http-equiv="Content-Type"
    content="text/html;charset=gb2312">
    <title>shoppinglist.asp</title></head>
    <body bgcolor="#FFFFFF" text="#EC7600"
    link="#EC7600"
    vlink="#EC7600">
    set conn=
    server.CreateObject("adodb.connection")
    ret=conn.Open("shopping","sa","")
    set re\conn.Execte("select *
    from inventotyitems where groupname=
    '"&left(requext.form("groupname"),2)&"'")
    <table border="1">
    <tr><th>序号</th>
    <th>产品名称</th>
    <th>产品号码</th>
    <th>单价</th>
    <th>折扣</th>
    <th>说明</th>
    <th>购买</th></tr>
    <%i=0
    do while not re.eof
    i=i+1%>
    <tr><td><%=i%></td>
    <td><%=rs("productname")%></td>
    <td><%=rs("partid")%></td>
    <td><%=rs("price")%></td>
    <td><%=rs("discount")%></td>
    <td><%=rs("description")%></td>
    <td><a
    href="http://ztf/work/basket.asp?partid=<%=rs("partid")%>">
    <lmg src="image/cd-dh.gir" width="56"
    height="34" alt="Cd-dh.gif (4076 bytes)">
    </a></td>
    </tr>
    <%rs.movenext
    loop%>
    </table>
    </center></div>
    </body>
    </html>■

    作者单位:朱铁峰(上海大学自动化学院 上海 200435)

  • 相关阅读:
    一本通1559跳跳棋
    一本通1558聚会
    一本通1555【例 4】次小生成树
    P1880 [NOI1995]石子合并
    P2066 机器分配
    P2073 送花
    P1886 滑动窗口
    P1637 三元上升子序列
    P1533 可怜的狗狗
    P1631 序列合并
  • 原文地址:https://www.cnblogs.com/8888/p/1421541.html
Copyright © 2020-2023  润新知