我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

2004



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 222
威望: 0
浮云: 1107
在线等级:
注册时间: 2006-09-25
最后登陆: 2011-10-25

5come5帮你背单词 [ dial /'daiəl/ n. (钟表等的)针盘,(电话的)拨号盘,刻度盘;v. 拨(电话号码),打(电话) ]


asp提高篇

2.1 全面解析Server对象


 
Server对象提供对服务器[屏蔽]问的方法和属性.大多数方法和属性是作为实用程序的功能提供的。

  语法:

   Server.property|method

  属性(property)

   Server对象只有一个属性:ScriptTimeout 程序能够运行的最大时间

  方法(Methods)

   CreateObject 建立一个对象实例.

   Execute 执行一个asp文件

   GetLastError 返回一个错误代码

   HTMLEncode 对指定的HTML代码进行转换.

   MapPath 将一个相对路径转化为一个绝对路径.

   Transfer 将当前的所有状态信息发送给另一个asp文件

   URLEncode 以URL形式转化指定的代码,包括空格

  Server对象的方法详细说明

   CreateObject

   语法

   Server.CreateObject( progID )

   参数

    progID

    指定要创建的组件名称,格式如下: [Vendor.]Component[.Version].

   要点:

    一般来说,用由Server.CreateObject方法创建的对象拥有页面的范围.这就说,当这页的asp程序执行完后,这种对象会自动地消失.

  为了创建一个拥有Session或Application范围的对象,你可以在Global.asa文件中使用

  Execute

  Execute 方法呼叫一个ASP文件并且执行它就像这个呼叫的ASP文件存在这个ASP文件中一样。这很像许多语言中的类的调用。

  语法

  Server.Execute( Path )

  参数

   Path

  指定执行的那个asp文件的路径。如是它是一个绝对路径,那么它必须是一个在这个ASP应用程序相同的地方(目录)。

  讲解

  Server.Execute 方法提供了一种将一个复杂ASP应用程序分化为小块单位来执行的方法。通过这种方法,你能够建一个ASP图书馆,你能够随便在你需要时调用你图书馆中的ASP文件。这个就有点像SSI了!嘿嘿!

  当IIS根据指定的ASP文件路径执行完这个ASP文件之后,就会自动返回以前的ASP文件。这个刚刚执行完的ASP文件有可能改变了HTTP head.但是和其它的ASP文件一样,当程序试图改变http head时,就会报错!

  这个path参数可以包括一个询问信息。

  如果在被呼叫和呼叫的ASP文件中都含有相同的子函数,那么这些子函数只在本ASP文件中起作用。举个例子,如果在下面的ASP1和ASP2两个文件中都含有放弃程序的子函数。首先ASP1呼叫ASP2,那么ASP2中的的OnTransactionAbort开始执行,当ASP2执行完毕,ASP1中的OnTransactionAbort才开始执行。

  ASP1:


< %@ Transaction=Required%>
< %
 Server.Execute ("Page22.asp")

 Sub OnTransactionAbort

 Sub OnTransactionCommit
%>


  Asp2.asp:


< %@
 Transaction=Required

 Sub OnTransactionAbort

 Sub OnTransactionCommit
%>


  Example

  
ASP1

< % Response.Write("I am going to execute ASP2 ")
Server.Execute("/myasps/asp2.asp")
%>


ASP2

< % Response.Write("Here I am")%>



  GetLastError

  GetLastError 方法返回一个ASPError Object 来描述一个错误信息.这个方法只适用于在asp文件发送任何内容给用户机之前.

  语法

  Server.GetLastError ()

  要点

  如果一个500;100 用户错误已经被定义在一个asp应用程序中,它是指的一个以.asp为后缀的文件。这种情况下,在这个程序运行时当一个错误发生时,服务器就会自动的以Server.Transfer这种方式传送到这个正在执行的ASP页面。ASP应用程序就会将有效的处理这个错误。另外,这个ASPError Object一定要有效,这样你就能够看到服务器提供给你的错误信息来改这个文件了!

  一般的Web Site 都是根据文件\iishelp\common\500-100.asp来构造的。你能够用它来执行一个asp错误,当然你能够自己定义了!。如果你想改变为另外一个asp文件的来执行这些用户错误。那么你可以用IIS中的snap-in.

  注意:当IIS发现了一个asp文件或者global.asa文件中的一个错误,那么一个500;100用户错误产生。以下的程序将不能执行!

  Example

  下面的三个例子证明不同的错误会产生的用户错误。三个错误是:

  编译错误

  运行错误

  逻辑错误

  第一个例子证明了一个编译错误,就是当IIS试图包含一个文件时产生的。这个错误会产生是因为在这个包含文件中没有定义所需的参数。第二个例子显示的是一个运行错误,这个程序中断的原因是程序中没有“next".第三个例子显示的是一个逻辑错误,因为这个程序试图除以一个0. 不行啦! 

  

Example 1

< %
  response.write "hello"
%>

Example 2

< %
  dim I
  for i=1 to 1
  nxt
%>

Example 3

< %
  dim i,j
  dim sum
  sum=0
  j=0

  for i=1 to 10
   sum=sum+1
  next

  sum=sum/j
%>



  HTMLEncode

  HTMLEncode方法对指定的字符串进行HTML编码.

  语法

   Server.HTMLEncode( string )

  参数
   string 要进行编码的字符

  例子

   下面的程序:


  < %= Server.HTMLEncode("The paragraph tag: ") %>


  输出为:

  The paragraph tag:

  注意 程序执行后在浏览器中看到的是:

  The paragraph tag:

  但是如果你用"查看源文件"看一下的话,源代码就不是了.

MapPath

  MapPath 方法将相对路径转化为服务器上的物理路径

  语法


  Server.MapPath( Path )


  参数

  Path

  相对路径。这个路径是以"/"或"\"开头的路径,如果这个路径中没有"\",那么MapPath方法就会返回以当前目录为基础的路径。

  讲解

  MapPath 方法不能检查路径在这个服务器下是否存在。因为 MapPath 转化路径时是不管这个路径是否在这个服务器下存在的。

  你能够用它来将一个相对路径转化为一个物理路径,然后再在这个路径下进行各种操作。

  Example

  在下面的例子中,data.txt文件存在 C:\Inetpub\Wwwroot\Script 目录中,而且一个test.asp 文件包括下面的代码。C:\Inetpub\Wwwroot 是该服务器的主目录 。

  下面的例子中,首先用环境变量"PATH_INFO"获得当前文件的物理路径。

  下面是Script 代码:


  < %= server.mappath(Request.ServerVariables("PATH_INFO"))%>


  显示为:

  c:\inetpub\wwwroot\script\test.asp

  因为下面的例子中路径参数没有以"/"开头,所以它是以当前目录转化的,asp文件是放在C:\Inetpub\Wwwroot\Script中的.以下是 scripts的内容:


  < %= server.mappath("data.txt")%>

  < %= server.mappath("script/data.txt")%>


  显示为:


  c:\inetpub\wwwroot\script\data.txt

  c:\inetpub\wwwroot\script\script\data.txt


  以下的两个例子是以"/"开头的.以下是scripts的内容:


  < %= server.mappath("\script")%>


  显示为:


  c:\inetpub\wwwroot\script\data.txt

  c:\inetpub\wwwroot\script


  直接用"/"或"\"就会得到服务器的主目录:


  < %= server.mappath("\")%>


  显示为:
 

  c:\inetpub\wwwroot

  c:\inetpub\wwwroot


  Transfer

  transfer 方[屏蔽]把一个正在执行的asp文件的所有信息传给另外一人asp文件。

  语法


  Server.Transfer (path)


  参数

  Path

  将要接收信息的asp文件的位置。

  要点

  当你调用Server.Transfer时,所有内建对象的状态信息都会包含在这次传送之中。这就是说,所有在保存在Session或Application中的信息都会被传送,而且,所有当前请求的信息都会被接收信息的asp文件所接受。

  Example

  下面的例子示范了从一个asp文件传送到另一个asp文件例子!


  ASP1

< % Dim sessvar1 Response.Write Session.SessionID
 Response.Write ("")
 Response.Write("I am going to ASP2 ")
 Server.Transfer("/Myasps/ASP2.asp")
% >

  ASP2


< % Response.Write Session.SessionID %>


  URLEncode

  URLEncode 方法可以将指定字符串进行URL编码。

  语法


  Server.URLEncode( string )


  参数

  string 指定要转化的字符串

  Example

  下面是代码:


  < % Respones.Write(Server.URLEncode("http://www.microsoft.com")) % >


  显示为:

  http%3A%2F%2Fwww%2Emicrosoft%2Ecom

  属性:ScriptTimeout

  ScriptTimeout 属性规定了程序的最大运行时间。

  语法


  Server.ScriptTimeout = NumSeconds


  参数

  NumSeconds

  规定了程序的最大的运行时间(以秒计算)。缺省值是90秒

  Remarks

  一个缺省的Scritpt Timeout的值会能过ASPScriptTimeOUT属性来设置在Web sertvic 或 Web server上。在程序中,ScriptTimeout属性的值不能小于这个缺省值。举个例子吧,如果NumSeconds我们设置为10秒,而缺省值为90秒,那么程序就会中止在90秒以后,而不是10秒以后的。同样,如果我们设置ScriptTimeout的值为100秒,那么,程序就会在100秒之后中止,而不是90秒。

  Example

  下面的例了中程序将被设置为100秒后自动中止。


  < % Server.ScriptTimeout = 100 %>


  下面的例子中将重新得到ScriptTimeout的值,然后把它存在Timout变量中


  < % TimeOut = Server.ScriptTimeout %>


程序的功能有了个大体的框架,其实可以自己添加一些功能,比如开始的数据库连接 ,可以先设置

变量然后通过INIT() 来选择不同类型的数据库

<%
’On Error Resume Next
Class ConnEx
public ConnEx
public DBpath ’---------数据库路径
public DBtype ’---------数据库类型 1(Access) 2(SqlServer) 3(可扩充)
public ConnMethod ’--------连接方式 (DSN,非DSN)
public User
public Pass
Sub Class_initialize
End Sub

Sub Init()
ConnStr = "Driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("Date.mdb")
Set ConnEx = Server.Createobject("ADODB.CONNECTION")
ConnEx.Open ConnStr
CatchError("Class_Terminate")
End Sub

Sub CatchError( Str )
If Err Then
Err.Clear
Class_Terminate()
Response.Write("捕捉到错误,程序结束!在"&Str&"处")
Response.End()
End If
End Sub

’******************************************
’*通过SQL语句来查找记录是否存在,容易出错
’******************************************

Function HasRecordBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs,HasR
Set Rs = ConnEx.Execute( Sql )
CatchError("HasReordSql")
If Not (Rs.eof Or Rs.bof) Then
HasR = False
Else
HasR = True
End If
Rs.Close
Set Rs = Nothing
HasRecordBySql = HasR
End Function

’***************************************
’*通过ID来查找记录是否存在
’***************************************

Function HasRecordById( StrTableName , IntID )
’CheckValue( IntID , 1 )
Dim Rs,HasR
Sql = "Select top 1 * from "&StrTableName&" Where Id = "&IntID
Call CheckSql(Sql,"R")
Set Rs = ConnEx.Execute(Sql)
CatchError("HasRecordByID")
If Not (Rs.eof Or Rs.bof) Then
HasR = False
Else
HasR = True
End If
Rs.close
Set Rs = Nothing
HasRecordById = HasR
End Function

’**********************************************
’*通过SQL语句取得记录集
’**********************************************
Function GetRsBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs
Set Rs = Server.CreateObject("Adodb.RecordSet")
Rs.Open Sql,ConnEx,1,1
Set GetRsBySql = Rs
End Function

’*********************************************
’*取得某个字段的值
’*********************************************
Function GetValueBySql( Sql )
Call CheckSql(Sql,"R")
Dim Rs,ReturnValue
Set Rs = ConnEx.Execute(Sql)
CatchError("GetValueBySql")
If Not( Rs.Eof Or Rs.Bof ) Then
ReturnValue = Rs(0)
Else
ReturnValue = "没有记录"
End If
Rs.Close
Set Rs = Nothing
GetValueBySql = ReturnValue
End Function

’==================================================Update,Insert===================================

’*********************************************
’*利用SQL修改数据
’*********************************************
Function UpdateBySql( Sql )
Call CheckSql(Sql,"w")
ConnEx.Execute(Sql)
CatchError("UpdateBySql")
UpdateBySql = True
End Function

’********************************************
’*利用SQL语句插入数据
’********************************************
Function InsertBySql(Sql)
Call CheckSql(Sql,"w")
ConnEx.Execute(Sql)
CatchError("InsertBySql")
InsertBySql = True
End Function

’======================================================Delete========================================

’********************************************
’*通过SQL语句删除
’********************************************
Function DeleteBySql( Sql )
Call CheckSql(Sql,"D")
ConnEx.Execute(Sql)
CatchError("DeleteBySql")
DeleteBySql = True
End Function

’********************************************
’*检查SQL语句权限,根据标志Flag 来检测语句拥有的权限
’********************************************
Sub CheckSql( Sql , Flag )
Dim StrSql,SinCounts,DouCounts,i
StrSql = Lcase(Sql)
SinCounts = 0
DouCounts = 0
For i = 1 to Len(StrSql)
If Mid(StrSql,i,1) = "’" Then SinCounts = SinCounts + 1
If Mid(StrSql,i,1) = """" Then DouConnts = DouCounts + 1
Next

If (SinCounts Mod 2) <> 0 Or (DouCounts Mod 2) <> 0 Or Instr(StrSql,";") > 0 Then
Call Class_Terminate()
Response.Write("SQL语法错误!")
Response.End()
End If
Select Case Flag
Case "R","r":
If Instr(StrSql,"delete") > 0 Or Instr(StrSql,"update") Or Instr(StrSql,"drop") > 0 Or Instr(StrSql,"insert") > 0 Then
Class_Terminate()
Response.Write("权限不足,没有执行写操作的权限")
Response.End()
End If
Case "W","w":
If Instr(StrSql,"delete") > 0 Or Instr(StrSql,"drop") > 0 Or Instr(StrSql,"select") > 0 Then
Class_Terminate()
Response.Write("权限不足,没有执行删除操作的权限")
Response.End()
End If
Case "D","d":
Case Else:
Response.Write("函数CheckSql标志错误!")
End Select
End Sub

Sub Class_Terminate
If Not IsEmpty(FriendConn) Then
FriendConn.Close
Set FriendConn = Nothing
CatchError()
End If
End Sub
End Class
%> 用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对象是提高程序质量的关键。下面让笔者根据自己在这方面的经验,向大家深入介绍一下ASP的这两个内建对象。

  一、Application对象的成员概述

  Application对象成员包括Application对象的集合、方法和事件。

  ⒈Application对象的集合

  Contents集合:没有使用<OBJECT>元素定义的存储于Applicaiton对象中的所有变量的集合

  StaticObjects:使用<OBJECT>元素定义的存储于Application对象中的所有变量 的集合

  例:在default.asp中有如下赋值


  application("a")="a"

  application("b")=128

  application("c")=false


  则有contents集合


  application.contents(1)="a" '也可写为application.contents("a")="a"

  application.contents(2)=128 '也可写为application.contents("b")=128

  application.contents(3)=false '也可写为application.contents("c")=false


  在此笔者推荐你在调用时使用类如application.contents("a")的方法,因为这样更为直观,如果用序号来表示的话则要考虑赋值的先后顺序。

  ⒉Application对象的方法

  Contents.Remove("变量名"):从Application.Contents集合中删除指定的变量

  Contents.RemoveAll() :把Application.Contents集合中的所有变量删除

  Lock() :锁定Application对象,使得只有当前的ASP页对内容能进行访问

  Unlock() :解除对Application对象的锁定

  例:在default.asp中:


  application("a")="a"

  application("b")=128

  application("c")=false

  response.write application.contents(1)&"<br>"

  response.write application.contents(2)&"<br>"

  response.write application.contents(3)&"<br>"

  response.write "After Remove b:"

  application.contents.remove("b")

  response.write application.contents(1)&"<br>"

  response.write application.contents(2)&"<br>"


  执行结果:

  a

  128

  False

  After Remove b:

  a

  False

  如果要删除集合中所有变量用application.contents.removeall即可,至于Lock和Unlock方法在实际中经常用到,读者也比较熟悉,在此就不在累赘。

  ⒊Application对象事件

  OnStart:第一个访问服务器的用户第一次访问某一页面时发生

  OnEnd :当最后一个用户的会话已经结束并且该会话的OnEnd事件所有代码已经执行完毕后发生,或最后一个用户访问服务器一段时间(一般为20分钟)后仍然没有人访问该服务器产生。

  想要定义application对象的OnStart和OnEnd事件里做什么需要将代码写在Global.asa这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是Inetpub\wwwroot\)

  二、Session对象的成员概述

  Session对象的成员比Application对象多一项属性,即:集合、属性、方法、事件

  ⒈Session对象的集合

  Contents :没有使用<OBJECT>元素定义的存储于特定Session对象的所有变量的集合。

  StaticObject:使用<OBJECT>元素定义的、存储于Session对象中的所有变量的集合。

  例:在default.asp中有如下赋值


  session("a")="a"

  session("b")=128

  session("c")=false


  则有contents集合


  session.contents(1)="a" '也可写为session.contents("a")="a"

  session.contents(2)=128 '也可写为session.contents("b")=128

  session.contents(3)=false '也可写为session.contents("c")=false


  ⒉Session对象的属性

  CodePage: 可读/可写。整型。定义用于在浏览器中显示页内容的代码页。代码页是字符集的数字值,不同的语言使用不同的代码页。例如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。

  LCID : 可读/可写。整型。定义发送给浏览器的页面地区标识。LCID是唯一地标识地区的一个国际标准缩写,例如,2057定义当前地区的货币符号是"£"。

  SessionID: 只读。长整型。返回本会话的会话标识符。每创建一个会话,由服务器自动分配一个标识符。可以根据它的值判断两个用户是谁先访问服务器。

  Timeout : 可读/可写。整型。为会话定义以分钟为单位的超时限定。如果用户在这个时间内没有刷新或请求任何一个网页,则该用户产生的会话自动结束。缺省值是20。

以上属性在实际应用中作用不大,而且基本上不需要怎么修改,这几个属性也没什么特殊的地方。

  ⒊Session对象的方法

  Contents.Remove("变量名"): 从Session.contents集合中删除指定的变量

  Contents.Removeall() : 删除Session.contents集合中的所有变量

  Abandon() : 结束当前用户会话并且撤消当前Session对象。

  Session对象的Contents.Remove("变量名")和Contents.Removeall()方法与Application对象的基本上没什么区别,为帮助理解,大家可以参照上面的例子将Application改为Session。这里要说明一下的是Contents.Removeall()和Abandon()的区别,执行这两个方法都会释放当前

  用户会话的所有Session变量,不同的是Contents.Removeall()单纯地释放Session变量的值而不终止当前的会话,而Abandon()除了释放Session变量外还会终止会话引发Session_OnEnd事件,希望大家注意两者的区别。

  ⒋Session对象的事件

  OnStart: 当ASP用户会话产生时触发,一旦有任一用户对本服务器请求任一页面即产生该事件。

  OnEnd : 当ASP用户会话结束时触发,当使用Abandon()方法或超时也会触发该事件。

  这两个事件和Application的OnStart、OnEnd事件一样,也是必须放在Global.asa文件里,下
面就重点和大家研究一下这四个事件的使用。

  三、Global.asa

  ASP的Application和Session对象体现了其他ASP内置对象所没有的特征--事件。每一个访客访问服务器时都会触发一个OnStart事件(第一个访客会同时触发Application和Session的OnStart事件,但Application先于Session),每个访客的会话结束时都会触发一个OnEnd事件(最后一个访客会话结束时会同时触发Application和Session的OnEnd事件,但Session先于Application)。

  OnStart和OnEnd这两个事件一般应用在虚拟社区中统计在线人数、修改用户的在线离线状态等。要具体定义这两个事件,需要将代码写在Global.asa文件,并将该文件放在站点的根目录下(缺省是\Inetpub\wwwroot\)。另外,Application和Session对象规定了在OnEnd事件里除了Application对象外其他ASP内置对象(Response、Request、Server、Session...)一概不能使用。以下举一个虚拟社区统计在线人数的例子来说明如何使用这两个事件。

  文件说明:

  global.asa 位于d:\Inetpub\wwwroot\目录下

  default.asp 位于d:\Inetpub\wwwroot\目录下,虚拟社区登录页面

  login.asp 位于d:\Inetpub\wwwroot\目录下,用于检测用户输入的用户名及密码

  index.asp 位于d:\Inetpub\wwwroot\目录下,虚拟社区首页

  bbs.mdb 位于d:\Inetpub\wwwroot\目录下,存储用户信息的数据库

  数据库(ACCESS)结构:

   ===bbs表===

  id 用户ID,长整型

  name 用户名,文本型

  code 密码,文本型

  online 在线状态,是/否

 

  ===global.asa===

  <script LANGUAGE="VBScript" RUNAT="Server">

  Sub Application_OnStart

   application("online")=0

  End Sub

  sub Application_OnEnd

  nd Sub

  Sub Session_OnStart

  End Sub

  Sub Session_OnEnd

   if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

    application.lock

    application("online")=application("online")-1

    application.unlock

   end if

  End Sub

  </script>

  ==============


  ===login.asp===

   ......'密码验证,连接数据库,检测用户输入的用户名及密码是否正确

  if 密码验证通过 then


   session("name")=rs("name")

   session("id")=rs("id")

   session("pass")=true

  else

   rs.close

   conn.close

   response.write "密码错误!"

   response.end

  end if

  application.lock

  application("online")=application("online")+1

  conn.Execute ("update bbs set online=1 where id="&session("id"))'将用户的状态设为在线

  application.unlock

  rs.close

  conn.close

  response.redirect "index.asp" '初始化数据后跳转到社区首页

  ===========


  在本例中,用application("online")变量记录已经登录社区的在线人数,因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,所以不能在OnStart事件里使Applicaiton("online")加一。因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录社区,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减一。

  这只是一个统计在线人数的简单例子,对于一个完整的虚拟社区来说,仅仅统计有多少人在线是不够的,在本例中数据库里有个online字段是用来记录用户的在线状态,用户登录的时候,在login.asp里将online设为1,但用户离线时并没有将online设为0,要完善它,就要修改一下Session_OnEnd事件,在该事件里将online设为0。


  ===global.sas===

  <script LANGUAGE="VBScript" RUNAT="Server">

  Sub Application_OnStart

   application("online")=0

   set application("conn")=Server.CreateObject("ADODB.Connection")

   application("db")=Server.MapPath("\bbs.mdb") '此处最好使用绝对路径\bbs.mdb,下文有详细介绍

  End Sub

  sub Application_OnEnd

   set application("conn")=nothing

  End Sub

   Sub Session_OnStart

  End Sub

  Sub Session_OnEnd

   if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

     application("con").open ="driver={Microsoft Access Driver (*.mdb)};dbq="&application("db")

      application.lock

      application("online")=application("online")-1

      application("con").Execute ("update friends set online=0 where id="&session.contents("id"))

      application.unlock

      application("con").close

   end if

  End Sub

  </script>

  ==============


  至此,完整的代码已经完成了。因为在Application和Session的OnEnd事件里不能使用Server对象,所以要将数据库的连接及数据库在服务器上的物理地址(d:\inetpub\wwwroot\bbs.mdb)存储在application变量中,并在Application_OnStart事件中预先处理。同理,在Session_OnEnd事件中不能用session("pass")来代替session.contents("pass")(以下有详尽说明)。

  四、本文实例中值得引起注意的两点

  ⒈OnEnd事件里的session.contents

  刚开始接触global.asa的朋友经常会将上面Session_OnEnd事件里的


  if session.contents("pass") then 写成

  if session("pass") then,


  这样的话系统不会提示错误,但是永远也不会执行then后面的内容,这是因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。因为IIS并没提示任何错误信息,所以笔者曾经在这上面浪费了很多时间。在此希望大家引以为鉴!

  ⒉Application_OnStart事件里用Server.MapPath获取数据库的物理地址时应使用绝对地址为了说明这个问题,大家可以做个实验:将上面Application_OnStart事件里的


  application("db")=Server.MapPath("\bbs.mdb")改为:

  application("db")=Server.MapPath("bbs.mdb")


然后在d:\inetpub\wwwroot\目录下建立一个test子目录,写一个temp.asp在test目录里。


  ====test.asp====

  <%response.write application("db")%>

  ================


再将temp.asp拷贝一份放在根目录下(d:\inetpub\wwwroot\)。用记事本打开global.asa,再打开两个浏览器,浏览器A输入地址http://localhost/temp.asp,按回车,将在浏览器上输出:


  d:\inetpub\wwwroot\bbs.mdb


然后,在记事本的窗口上点"文件"菜单,选"保存"(使global.asa的修改时间改变,从而使IIS重启动所有服务),再在浏览器B输入地址http://localhost/test/temp.asp,按回车,在浏览器上输出的是:


  d:\inetpub\wwwroot\test\bbs.mdb


global.asa文件虽然是放在站点根目录下,但是如果在server.mappath中使用的是相对地址,而触发Application_OnStart事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心。

从今天开始我们将正式学习 ASP 的精华部分 --ActiveX 组件。事实上,当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作或者对 WEB 服务器上的文件系统进行操作,亦或你需要一个 WEB 广告交换程序,所有这一切你都必须通过调用 ASP 内建的 ActiveX 组件或自己编写所需的组件来完成。



   那么,究竟什么是 ActiveX 组件呢?它又是如何运作的呢?其实 ActiveX 组件是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。例如,股票行情收报机组件可以在 Web 页上显示最新的股票报价。当你在 WEB 服务器上安装完 ASP 环境后,就可以直接使用它自带的几个常用组件,如 Database Access 组件。当然你也可以从第三方开发者处获得可选的组件 , 也可以编写自己的组件。你可以利用组件作为脚本和基于 Web 应用程序的基本构造块,只要知道如何访问组件提供的对象,即使你是位编写脚本的新手,也可以在不了解组件运作方式的情况下编写 ASP 程序。总而言之, ActiveX 组件使您不用学习复杂的编程就能够写出强大的 WEB 服务器端脚本。如果您是位 Web 应用程序的开发者,可以使用任何支持组件对象模型(COM)的语言来编写组件,如, C、 C++、 Java 或 Visual Basic。如果你熟悉 COM 编程, ActiveX 组件就是 Automation 服务器。但是要在 Web 服务器上运行, ActiveX 组件不能有图形用户接口元素,如 Visual Basic 的 MsgBox 函数。组件是可以重复使用的。在 Web 服务器上安装了组件后,就可以从 ASP 脚本、 ISAPI 应用程序、服务器上的其他组件或由另一种 COM 兼容语言编写的程序中调用该组件。

   那么我们在 ASP 中应该如何调用组件呢?如前所述,组件是包含在动态链接库 (.dll) 或可执行文件 (.exe) 中的可执行代码。组件可以提供一个或多个对象以及对象的方法和属性。要使用组件提供的对象,我们首先要创建对象的实例并将这个新的实例分配变量名。使用 ASP 的 Server.CreateObject 方法可以创建对象的实例。接着,使用脚本语言的变量分配指令为对象实例命名。创建对象实例时,必须提供实例的注册名称“PROGID”。如下要创建一个 Ad Rotator 对象的实例 :
   < % Set MyAds = Server.CreateObject("MSWC.AdRotator") %>

   我们必须使用 ASP 的 Server.CreateObject 方法来创建对象实例,否者 ASP 无法跟踪脚本语言中对象的使用。

   使用 HTML< OBJECT> 标签同样可以创建对象实例,但必须为 RUNAT 属性提供服务器值,同时也要为将在脚本语言中使用的变量名提供 ID 属性组。使用注册名 (PROGID) 或注册号码 (CLSID) 可以识别该对象。下面的例子使用注册名 (PROGID) 创建 Ad Rotator 对象的实例:
  

< OBJECT RUNAT=Server ID=MyAd PROGID="MSWC.AdRotator">< /OBJECT>

   下面列出了 ASP 可安装的常用组件。

Ad Rotator 创建一个 AdRotator 对象,该对象可按指定计划在同一页上自动轮换显示广告。
Browser Capabilities 创建一个 BrowserType 对象,该对象决定访问 Web 站点的每个浏览器的性能、类型及版本。
Database Access 提供用 ActiveX Data Objects (ADO) 对数据库的访问。
Content Linking 创建一个 NextLink 对象,该对象可生成 Web 页内容列表,并象书一样将各页顺续连接。
File Access 组件 提供文件的输入输出访问。
Collaboration Data Objects for NTS 组件 可以快速、简便的在 Web 页上添加收发邮件功能。该组件只适用于 Internet Information Server for Windows NT? Server 。
MyInfo 创建一个 MyInfo 对象,该对象追踪个人信息,例如站点管理员的姓名、地址及显示选择。
Counters 创建一个 Counters 对象,该对象可以创建、保存、增加或检索任意数量的[屏蔽]计数器。
Content Rotator 自动翻转 Web 主页上的 HTML 内容字符串。
Page Counter 记录并显示 Web 页被打开的次数。

   现在 WEB 广告几乎充斥了整个网络,那么究竟如何在你自己的网站上建立一个符合广告领域标准功能的广告系统呢?答案是利用 ASP AD Rotator 组件 ! 它允许在每次访问 ASP 页面时在页面上显示新的广告,并且提供了很强的功能,例如 : 旋转显示在页面上的广告图象的能力、跟踪特定广告显示次数的能力以及跟踪客户端在广告上单击次数的能力。 AD Rotator 组件的工作是通过读取 AD Rotator 计划文件来完成的,该文件包括与要显示的图象文件的地点有关的信息以及每个图象的不同属性,下面就是一个标准的 AD Rotator 计划文件 :
---ADROT.TXT---
REDIRECT /scripts/adredir.asp
WIDTH 440
HEIGHT 60
BORDER 1

ads/homepage/chinabyte.gif
http://www.chinabyte.com/
Check out the IT site
2
ads/homepage/gamichlg.gif
-
Sponsored by Flyteworks
3
ads/homepage/asp.gif
http:// www.aspallian.com/
Good ASP site on net
3
ads/homepage/spranklg.gif
http://www.clocktower.com/
The #1 Sports site on the net
2

   该段代码的前四行包含广告的全局设置。 Redirect 行指出广告将成为其热连接的 URL, 注意这里不是为广告本身指定的 URL,而是将调用的中间页面的 URL,这样我们就可以通过这个中间页面跟踪单击广告的次数。该 Redirect URL 将与包含两个参数的查询字符串一起调用 : 特定广告主页的 URL 和图象文件的 URL。星号上面的其余三行简单说明如何显示广告。前两行以像素为单位指定网页上广告的宽度和高度,默认值是 440 和 60 个像素。后一行,同样是以像素为单位指定广告四周超链接的边框宽度 , 默认值是 1 个像素。如果将该参数设置为 0,则将没有边框。

   星号下面的行以每四行为一个单位描述每个广告的细节。在此例[屏蔽]有 16 行,描述四个广告。每个广告的描述包含图象文件的 URL、广告的主页 URL(如果广告客户没有主页,请在该行写上一个连字符“-”,指出该广告没有链接)和图象的替代文字以及指定该页与其他页交替显示频率的数值。

   图象是重定向页面的热连接,它在查询字符串中设置了两个值, url=/scripts/adredir.asp 以及 image=/ads/homepage/asp.gif。要确定广告显示的频率,可以将计划文件中所有广告的权值相加,在该例中总数是 10,那么 aspallian 的广告权值为 3,这意味着 AdRotator 组件每调用十次,它则显示 3 次。

   重定向文件是用户创建的文件。它通常包含用来解析由 AdRotator 对象发送的查询字符串的脚本并将用户重定向到与用户所单击的广告所相关的 URL。用户也可以将脚本包含进重定向文件中,以便统计单击某一特定广告的用户的数目并将这一信息保存到服务器上的某一文件中。增加计数器和重定向用户是通过下面两行 ASP 脚本来实现的 :
< %
Counter.Increment(request.querystring("url"))
response.redirect(request.querystring("url"))
%>

   现在我们看一下 Ad Rotator 组件是如何在页面中使用的,首先必须使用 Server.CreateObject 方法实例化 Ad Rotator 对象。 Ad Rotator 组件的 PROGID 属性是 MSWC.AdRotator。完整的代码如下 :
< % Set ad = Server.CreateObject("MSWC.AdRotator") %>
< %= ad.GetAdvertisement("/ads/adrot.txt") %>


   Ad Rotator 组件支持的唯一方法是 GetAdvertisement,它只有一个参数 :AdRotator 计划文件的名称。注意指向文件的路径是从当前虚拟目录的相对路径,物理路径是不允许的。 GetAdvertisement 方法从 Rotator 计划文件中获取下一个计划广告的详细说明并将其格式化为 HTML 格式。下面的 HTML 由 GetAdvertisement 方法生成且被添加到网页的输出中,以便显示 Rotator 计划文件中的下一个广告。
< A HREF="http://www.chinabyte.com/scripts/adredir.asp?http://www.aspallian.com/">< IMG
SRC="" ALT="Good ASP site on net" WIDTH=440 HEIGHT=60 BORDER=1>< /A>

   使用 AdRotator 组件我们可以直接通过对象属性而不是计划文件中的设置来直接控制某些广告特性,其可用属性如下 :

   Border 指定广告边框的大小。

   Clickable 指定广告是否为超链接。

   TargetFrame 指定显示广告的框架的名称。


< %
Set ad = Server.CreateObject("MSWC.AdRotator")
ad.Border = 0
ad.Clickable = true
ad.TargetFrame = AdFrame
ad.GetAdvertisement("/ads/adrot.txt")
%>

   通过上面的学习,相信你已经能够熟练运用 ASP 的内建 AdRotator 组件为自己的网站建立一个标准的广告显示程序了。你是否难以相信一切竟是如此的简单?其实真正能令你[屏蔽]的还在后头呢,敬请关注下一篇 ASP ActiveX 组件大揭密!



、 Browser Capabilities 组件众所周知,并不是所有浏览器都支持现今 Internet 技术的方方面面。有一些特性,某些浏览器支持而另一些浏览器却不支持,如 : ActiveX 控件、影像流、动态 HTML、 Flash 以及脚本程序等。使用 ASP 的 Browser Capabilities 组件,就能够设计“智能”的 Web 页,以适合浏览器性能的格式呈现内容。 Browser Capabilities 组件能够创建一个 BrowserType 对象,该对象提供带有客户端网络浏览器的功能说明的用户脚本。该组件之所以能识别客户浏览器的版本等信息,主要是因为当客户浏览器向服务器发送页面请求时,会自动发送一个 User Agent HTTP 标题,该标题是一个声明浏览器及其版本的 ASCII 字符串。 Browser Capabilities 组件将 User Agent 映射到在文件 Browscap.ini 中所注明的浏览器 , 并通过 BrowserType 对象的属性来识别客户浏览器。若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN"。在默认情况下, browscap.ini 文件被存放在 WINDOWS\SYSTEM\INERSRV( 如果是 95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目录中,你可以自己编辑这个文本文件,以添加自己的属性或者根据最新发布的浏览器版本的更新文件来修改该文件。请看以下 checkCookie() 过程,使用 BrowserCap 对象的 Cookie 属性来判断客户端浏览器是否支持 Cookie,并返回信息 :



< %
Sub checkCookie()
Set BrowserCap=Server.CreateObject("MSWC.BrowserType")
if BrowserCap.Cookie=True then
response.write "你的浏览器支持 Cookie!"
else
response.write "对不起,你所使用的浏览器不支持 Cookie!"
end if
end Sub
%>


   有关 Browser Capabilities 组件的详细信息,请参见[屏蔽]站设计十八般武艺 --ASP 篇 (2)。

   二、 File Access 组件如果你的网龄足够大的话,你一定见过“恐龙时代”的 CGI 留言簿,那是 WEB 留言簿最早的雏形。那时候在基于 Internet 的 WEB 应用程序中连接服务器后端数据库还十分困难,因此留言簿中的历史信息并不是同如今一样存储在后端数据库中。那么这些数据究竟是保存在哪里的呢?答案就是“文本文件”, CGI 程序可以将从客户端接收的信息写进一个存放在服务器端的文本文件中,该文件可以是 HTML 文件或 TXT 等文件,这样就使得程序员们可以不通过同数据库连接就可以将客户信息保存下来,但是写此类 CGI 程序甚是烦琐,下面列出了一个此类程序的最简单的样本 :

#!/usr/local/bin/perl
# Perl Location one your server
print "Content-type: text/plain\n\n";
if($ENV{'REQUEST_METHOD'}eq"POST"){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'}eq"GET"){
$buffer=$ENV{'QUERY_STIRNG'};
}
@pairs=split(/&/,$buffer);
foreach $pair(@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;
$FORM{$name}=$value;}
$file_name="guestbook.txt";#File name
#具体内容
open(FILE,">>$file_name")  die "打开文件错误";
print FILE "记录时间":$date \n\n";
print FILE "姓名":$FORM{'name'}";
print FILE "单位":$FORM{'company'}\n";
print FILE "电话":$FORM{'phone'}
print FILE "地址":$FORM{'address'}\n";
print FILE "邮编":$FORM{'zip'}
print FILE "邮件地址":$FORM{'email'}\n";
print FILE "返回意见":$FORM{'content'}
close (FILE)


  大家可以感觉到,与 ASP 相比此类 CGI 程序的可读性和易操作性都较差。那么你一定想问 ASP 是否也能直接在服务器上写文件呢?答案当然是肯定的。但是聪明的朋友可能会想到,既然 ASP 同 WEB 数据库的连接如此便捷,我们又何需再将客户信息写在文本文件中呢, ASP 的这个功能岂不是画蛇添足?的确,对于那些我们常见的留言簿、 BBS 等 WEB 应用程序而言,无论是在程序的执行效率还是易用性上,我们都不可能再用写文本文件来替代数据库,但是在某些 WEB 应用领域里写文本文件既是一种规范也是一种相对数据库而较便捷的方法。如果你对 NT 较熟悉的话,你一定知道 NT 具有非常强大的安全机制,它可以将几乎所有的服务器操作和连接的信息自动保存在一个后缀名为 .log 的文件中,其实这种技术也完全可以被运用在 WEB 上,用来记录一些的客户登陆信息。下面的这段程序正是利用 ASP 读写文本文件的特性,在一个 WEB BBS 程序中创建自动记录每个用户发言记录的功能。


< %
Set fs = CreateObject("Scripting.FileSystemObject")
ForReading = 1
'以只读模式打开文件。不能对此文件进行写操作。
ForAppending = 8
'打开文件并在文件末尾进行写操作。
TristateUseDefault = -2
TristateTrue = -1
TristateFalse = 0

'-----------写入系统log开始--------
servermap=server.MapPath("\bbs\log\")
'映射系统物理路径
temp=servermap&"\"&year(date)&month(date)&"\"
'获取系统物理路径和时间,并以此作为log文件存放的物理路径
if Not fs.FolderExists(temp) then
fs.CreateFolder(temp)
end if
'检测是否存在文件夹,否则自动创建
dim syslog
dim tempname
tempname=date
syslog=temp&tempname&".log"
'文件名为e:\bbs\log\月份\月日.log
li=user&"&"&Now&"&"&Request.ServerVariables("REMOTE_ADDR")&"&"&tempfile&"&"&letter&"&"&title
'log文件记录的格式为:用户名&发信时间&用户ip&文件路径&信区&信件标题
if fs.FileExists(syslog) then
Set ss = fs.OpenTextFile(syslog,ForAppending,true)
else
set ss = fs.CreateTextFile(syslog,ForWriting,false)
end if
'检测log文件是否存在,如果存在则追加文件内容,反之则直接写文件
ss.WriteLine(li)
ss.Close
'-----------log文件写入结束---------
%>


  如果你没有完全看懂上面的这段程序,就请听作者慢慢道来。 File Access 组件提供了可用来访问计算机文件系统的方法和属性。我们可以使用 File Access 组件创建 FileSystemObject 对象,以上程序的第一句就是利用 File Access 组件创建了一个名为 fs 的对象实例。在对象被创建后,你可以通过它访问文件,该对象没有属性,它唯一的意义就是创建、打开或读写文本文件。 FileSystemObject 对象有两种最常用的方法,一种用来创建文件,另一种是用来打开并读写文本文件。 CreateTextFile 方法获得你指定的文件名并创建该文件,它返回一个 TextStream 对象,你可以用该对象在文件被创建后操作该文件, CreateTextFile 方法的语法如下 :
  Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite],[Unicode])

  下面作者给大家解释一下 CreateTextFile 方法的参数

  1、 Filename 包含文件路径名的字符串,可以是文件的全路径名,包括驱动器名和目录名,或者也可以只是文件名,如果只包含文件名的话,文件将被创建在站点的根目录下。

  2、 Overwrite 布尔量,设置成 False 时可以防止 FileSystemObject 对象在创建一个新文件时删除已存在的文件,该参数是可选的,如果没有赋值系统默认为 true,具有相同文件名的已有文件会被删掉。

  3、 Unicode 可选参数。布尔值指明是否以 Unicode 或 ASCII 文件格式创建文件。如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。

  在前面的程序中我们用 set ss=fs.CreateTextFile(syslog,ForWriting,false) 来在 log 文件不存在的情况下创建文件并对文件进行写操作,这里的“ForWriting”表示写文件。

  与 CreateTextFile 方法不同, OpenTextFile 方法用来获得你指定的文件名并打开该文件,利用它所带的参数我们可以对文件进行各种不同的操作,和 CreateTextFile 方法一样, OpenTextFile 方法返回一个 TextStream 对象,使得你可以在文件被打开后操作该文件。 OpenTextFile 方法的语法如下 :
   Set objTextStream=FileSystemObject.OpenTextFile(Filename,[IOmode],[Create],[Format])

  参数说明如下 :

  1、 Filename 必须的变量,同 CreateTextFile 的 filename

  2、 IOmode 可选的常量,取值为下列两个常数之一 ForReading 或 ForAppending,如果 mode 为 1,文件以只读方式打开,如果为 8,则文件以追加的方式打开。

  3、 Create 可选的布尔量,指定如果你想打开的文件不存在是做什么操作,如果其值为 True,当文件不存在时就自动创建一个空的文件。如果为 False,就会在文件没找到时产生一个出错信息,其默认值是 False,建议将其设为 True,以避免在打开文件时检查是否出错。
   4、 Format 可选值,可以选择三种 Tristate 值分别指定文件的格式, -2、 -1、和 0 分别对应于系统缺省、 unicode 和 ASCII。

  在打开或创建了文本文件后,就得到一个 TextStream 对象,该对象有一个光标,就好象是在字处理程序中的光标一样,指出接下来要敲入的字符将出现的位置,它同时也指出你要读取的字符的位置。不能通过 CreatObject 来创建一个 TextStream 对象,得到 TextStream 对象的唯一方法是如前所述的用 FileSystemObject 对象打开一个存在的文本文件或者创建一个新的文件。
   下面列出了 TextStream 对象的属性和方法

   TextStream.AtEndOfLine 只读布尔量,当光标在当前行的末尾时,其值为 true,反之则为 false

   TextStream.AtEndOfStream 只读布尔量,如果光标在流的末尾时,其值为 true,否则为 false

   TextStream.Column 只读的整数,统计从行首到当前光标位置之间的字符数

   TextStream.Line 只读的整数,指明光标所在行在整个文件中的行号

   TextStream.close() 关闭流以及对应的文本文件

   TextStream.read(Num) 指定从光标的当前位置开始从文本文件中读取一定数目的字符

   TextStream.readall() 将整个流读入一个字符串中

   TextStream.readline() 将一整行的字符读入一个字符串中

   TextStream.write(text) 将一个字符串写入流中

   TextStream.writeline() 将一个文本串写入流中

   TextStream.skip(Num) 在流中,将光标的位置移动一定数目的字符串长度

   TextStream.skiplines() 在流中,将光标移动一定数目的行数

   TextStream.writeblank 将一定数目的空行写入流中

   lines(num)

  相信大家现在已经可以感觉到 ASP File Access 组件的强大功能了,其实它远不仅仅可以写一些 log 文件,通过它你甚至可以毫不费力的远程自动更新你的网站,你只要把固定格式的文本文件传送到远端的服务器上,通过 File Access 组件读取文件,并自动生成全新 HTML 页面即可,而不必再辛辛苦苦地一个一个地更新 HTML 文件。如果你有兴趣,你完全可以用 ASP 的 File Access 组件写一个自己的全自动 HTML 生成器,充分享受维护网站的超前轻松感。

  Cookie简介

  首先,我们对Cookie做一个简单的介绍,说明如何利用ASP来维护cookie。

  Cookie是存储在客户端计算机中的一个小文件,这就意味着每当一个用户访问你的站点,你就可以秘密地在它的硬盘上放置一个包含有关信息的文件。这个文件几乎可以包含任何你打算设置的信息,包括用户信息、站点状态等等。这样的话,就有一个潜在的危险:这些信息有可能被黑客读取。为了防止这个问题的发生,一个有效的办法就是cookie只能被创建它的域所存取。这就是说:比如ytu.edu.cn只能访问ytu.edu.cn创建的cookie。通常来讲,这没有什么问题;但是,如果需要两个不同域上的两个不同站点共享保存在cookie中的用户信息,该如何处理呢?当然可以选择复制用户信,但是,如果你需要用户只能在一个站点上注册,并且自东成为另外一个站点的注册用户呢?或者,两个站点共享一个用户数据库,而又需要用户自动登录呢?这时候,跨越域共享cookie是最好的解决方案。



  这里,先看一些ASP处理cookie的代码,以便以后便于引用参考。

 
 '创建Cookie

  Response.Cookies("MyCookie").Expires=Date+365

  Response.Cookies("MyCookle").Domain="mydomaln.com"

  Response.Cookies("MyCookle")("Username")=strUsername

  Response.Cookies("MyCookle")("Password")=strPassword


  读写cookie非常简单,上面的代码创建一个cookie并给cookie设置属性:域、过期时间,以及其他一些保存在cookie中的值。这里,strUsename,strPassword是在前面某个地方设置的变量。然后,通过下面的语句在cookie中读取。

  '读取Cookie

  datExpDate=Request.Cookies("MyCookie")

  strDomaln=Request.Cookies("MyCookle").Domain

  strUsername=Request.Cookies("MyCookle")("Username")

  strPassword=Request.Cookies("MyCookie")("Password")

  更详细的信息,可以参考ASP的资料。

  实现

  简单地共享cookie的诀窍是重定向,一般过程为:

  1.一个用户点击siteA.com。

  2.如果用户没有siteA.com的cookie,就把用户重定向到siteB.com。

  3.如果用户有siteB.com的cookie,把用户连同一个特殊的标志(将在下面解释)重定向回siteA.com,否则,只把用户重定向到siteA.com。

  4.在siteA.com创建cookie。

  看起来很简单,仔细分析一下:siteA.com和siteB.com共享相同的用户设置,所以,如果用户有siteB.com的cookie(已经注册),siteA.com能够同样读取cookie、提供cookie所允许的特性。这样,访问siteA.com的用户就如同访问了siteB.com。

  这个检查的环节应该在siteA.com中的文件所包含一个cookies.inc中实现。让我们看一下这段代码:


  l—1

  'SiteA.com"检查cookie

  If Request.Querystring("Checked")<>"True" then

  If not Request.Cookies("SiteA_Cookie").Haskeys then

  '重走向到siteB.com

  Response.Redlrect("http://www.siteB.com/cookie.asp")

  End if

  End if


  如果用户有一个siteA.com的cookie,则不需要做任何事情了;第一个if语句用来消除无限的循环。让我们看一下siteB.com上的cookie.asp文件来获得进一步的理解。

  1—2

  'SiteB.com

  '检查cookie

  If not Request.Cookies("SlteB_Cookle").Haskeys then

  '重定向到 siteA.com

  Response.Redirect("http://www.siteA.com/index.asp"&"?checked=True")

  Else

  '获取username

  strUsername=Request.Cookies("SiteB_Cookie")("Username")

  '将用户连同一个特殊的标志返回到siteA.com

  Response.Redlrect("http://www.siteA.com/index.asp"&"?checked=True"&"identrfer="&strUsername)

  End if

  如果用户在siteB.com上仍没有cookie,于是,将他送回到siteA.com,并且通过在查询语句中提供一个叫做"checkd"的参数让应用程序知道你已经检查过cookie了。否则,将用户送回到siteB.com,并退出循环。


2.7 ASP中使用Session变量的优缺点


 
许多人利用Session变量来开发ASP(Active Server Pages)。这些变量与任何编程语言中通用的变量非常相似,并且具有和通用变量一样的优点和缺陷。任何命令都需要运行时间和存储空间(甚至GOTO’s语句如此),Session变量同样需要自己的运行时间和存储空间。过多地使用Session变量就会导致无法代码冗余,并且使服务器运行成本提高下面是我个人使用Session变量的一些主要观点和心得体会。



优点

  如果要在诸多Web页间传递一个变量,那么用Session变量要比通过QueryString传递变量可使问题简化。

  要使WEb站点具有用户化,可以考虑使用Session变量。你的站点的每位访问者都有用户化的经验,基于此,随着LDAP和诸如MS Site Server等的使用,已不必再将所有用户化过程置入Session变量了,而这个用户化是取决于用户喜好的。

  你可以在任何想要使用的时候直接使用session变量,而不必事先声明它,这种方式接近于在VB中变量的使用。使用完毕后,也不必考虑将其释放,因为它将自动释放。

缺点

  Session变量和cookies是同一类型的。如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量!

  当一个用户访问某页面时,每个Session变量的运行环境便自动生成,这些Session变量可在用户离开该页面后仍保留20分钟!(事实上,这些变量一直可保留至“timeout”。“timeout”的时间长短由Web服务器管理员设定。一些站点上的变量仅维持了3分钟,一些则为10分钟,还有一些则保留至默认值20分钟。)所以,如果在Session中置入了较大的对象(如ADO recordsets,connections, 等等),那就有麻烦了!随着站点访问量的增大,服务器将会因此而无[屏蔽]常运行!

  因为创建Session变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,过度使用session变量将会导致代码不可读而且不好维护。

  虽然“你可以在任何想要使用的时候直接使用session变量,而不必事先声明它,这种方式接近于在VB中变量的使用。使用完毕后,也不必考虑将其释放,因为它将自动释放”。但是,“谁”想到那儿呢?变量的含义是什么?这些都变得不很清晰。

总结

  使用Session变量既有优点,又有缺点。就我个人的观点,最好少用,但在某些地方使用它们确实能使Web开发大大地简化。是否使用Session变量完全取决于个人的需要,无论使用与否,都要事先考虑其优缺点



本帖最近评分记录:
  • 浮云:3 (by tj.g) | 理由: 优秀转贴
  • 顶端 Posted: 2006-12-01 16:52 | [楼 主]
    我来我网·5come5 Forum » 创意&美化&设计

    Total 0.009801(s) query 5, Time now is:12-23 02:50, Gzip enabled
    Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号