使用AUO(Active User Object)来维护用户信息
如果你要是对其中的一些技术术语不明白的话,
请参考我在前面发过的有关ADSI的文章。
现在在进行网站编程的时,要保存用户信息的时候经常使用的
技术是:
1。使用Session对象来保存用户信息,这种方式很常见,它允许
你在你的程序的任何一个位置添加一个Session变量,它还不对你
申明的变量进行类型检查,它的缺点很明显,一是它的随意性让
你很不方便管理你的程序结构,二是它的对数据类型的不约束性
使得你很难找到程序中的BUG,这样当你的程序出现问题的时候
你不得不在整个程序中检查所有的Session变量。
Session变量的移植性和容错性是它最头疼的地方。
2。使用隐藏的Form元素来传递变量。但是由于这种方式要求你
使用明文来传递你的变量,当对变量的安全要求比较严格时,
又是一个很头疼的问题。
现在我们讨论一个新的用来传递变量的技术,就是AUO对象。
这种很不错的动态数据服务器能够使用Site Server中的
Membership Server来实现。
对Session数据使用AUO
要使用AUO,你必须先定义好你的Membership Server并且指派一个网站。
一旦你设置好这些配置,我们就可以配置Membership Directory和AUO.
配置AUO
配置过程主要分下面四个步骤:
1。定义你需要的Session State属性
2。新建或则选择一个session state数据的类
3。为动态数据建立一个容器(container)
4。配置secondary AUO Provider
在面向对象的编程技术中,属性被认为是一个类中的一个成员。
你必须为每个数据类型关联一个它的属性。
举例来说,如果想要实现一个在线购书系统,我们需要定义一个购物篮类,
它应该包括的属性有篮内的货物数目,它包含了一个数字(numeric)属性
要定义这个属性,使用Site Server的MMC,在成员目录(Membership Directory)中
增加所有的属性。
定义好属性后,现在你需要做的是给这些属性关联一个类,
一个类的实现称为一个对象,每个对象对自己的属性都可以拥有不同的数值。
如果你已经有了一个Session State类, 你要做的就是给这个类添加属性而已。
否则你需要使用Membership Directory Manager新建一个新Session State的类
在下面的例子中使用到的一个类为SessionStateClass.
现在你需要建立一个secondary AUO provider, 它是用来给主AUO provider提供辅助的
数据信息的.这可以是一个兼容ODBC的数据库,或则是一个其它的目录服务或则是一个其它的
Membership Directory容器.在例子中,辅助的数据为Session State的Membership Directory容器信息。
这样,新建一个在Membership Directory下用来保存动态session信息的容器的
root和name为它的ou=SessionStateData. 这个secondary AUO provider将使用
SessionStateData容器来储存数据.使用MMC给SessionState建立一个secondary AUO provider
有如下属性:
ADS 路径: computername:LDAPport/o=yourDirectory/ou=SessionStateData
Schema 路径: computername:LDAPport/o=yourDirectory/ou=Admin/cn=Schema/cn=SessionStateClass
现在你已经准备好使用AUO来保存session信息的一切手续了。
虽然看上去很混乱(说真的,我翻译到这里是比较的混乱), 你刚才所做的在Membership Directory的scope中
新建和实现一个对象:定义一个类(class), 该类有用来描述和说明一个session state的属性(或则说是成员)
而在实现的过程中,每个用户(就是客户端的浏览器)将得到这个类的一个实现(或则说是对象).
好了,现在让我们来看看AUO到底是怎么工作的把。
在ASP中使用下面的语句调用一个AUO provider
Set objUser = Server.CreateObject("Membership.UserObjects")
你能够通过下面的语句调用获得这个对象的任何静态属性。
Response.Write "Your login: " + objUser.cn
要设置动态信息,你需要先确保该对象确实存在。
因为它是一个动态对象(dynamic object),所以你不能够把它当成一个
自动(automatically)对象。
If Not IsArray(objUser("SessionState").objectClass) Then
objUser("SessionState").objectClass =
Array("SessionState", "dynamicObject")
End If
接下来,设置这个AUO对象的TTL(生存期)数值. 当该时间到后,这个对象将终止和消失。
这需要调用SetInfo方法。
objUser("SessionState").entryTTL = 900 ' 默认单位为秒
objUser("SessionState").SetInfo
最后,我们来设置该对象的数值(讲简单点,就是终于可以来实现Session的功能了)
就是给属性numItems赋值。注意,在schema中这个属性必须要存在,而且数据类型必须要匹配。
objUser( "SessionState" ).numItems = 3
objUser( "SessionState" ).SetInfo
如果使用一个不存在的属性或者使用了错误的数据类型,你都将得到出错信息的。
访问AUO Session State
要访问你刚才赋值的属性,只要指定了用户对象,和secondary AUO的name以及属性名即可。
Response.Write objUser("SessionState").numItems
注意的是,如果你设置的TTL到期后,你使用以上语句将得不到任何返回值。
比较一下Session和AUO Objects的不同之处
你也许已经注意到,在你使用AUO的属性前你必须先要定义这些属性,
这是一个相对与Session对象而言一个很大的优势,这将迫使个人开发者在设计变量,
对外接口上发更多的时间(也就是说再也不能够象使用Session一样,随便使用任何名字了)。
并且把变量的声明都集中在一起,这对于多个开发者同时开发一个项目而言是个很大的进步。
同时它也提供了更多的处理数据的可能。你能够使用ADSI来访问保存Session State的组(group)
并且它能够很方便的传递所有的用户信息,这包括:人们在你的在线购物系统中买了什么东西,
,他们在你的在线购物系统中不满意什么,在什么时间他们买了什么东西等等。