现存的asp版的eville禁止对站点的某些部分的访问,除非用户已经登录。一些功能像查看将来的优惠特价,报名上课,以及了解自己当前的入学状况是受限制区域。如果想在未登录的状态下访问这类区域,你只会被重新导回到登录页面。用户在一份表格中输入他们的用户名与密码,然后与数据库的学生表进行比较,如果登录成功,一个名为blnloggedin的会话变量便被设为真。这种方法对这个站点是有效的,因为它架设在一台单一的服务器上。其它的方法将被用于web farms上的web应用程序,比如asp+的会话存储,或sql的会话存储。
===确认用户输入===
代码重写工作量最大的部分在于那些获取用户输入的页面,用户输入这些信息以登记成为eville会员。有一个叫signup.asp的页面,用来让用户输入他们的重要信息,现有会员也可籍此更新信息。未转换前,表格的数据通过http post方式递交给一个叫cookie.asp的页面。该页会确认表格中的数据,如果存在错误,将用户导回signup.asp同时在query string中加上错误号。接着一个select case语句会将基于错误号的输出进行转换。我们检查的错误包括:
*未输入用户名
*未输入密码
*密码与密码确认不符
*用户名在数据库中已存在
通过将所有的输入域(field)转换成服务器控件,然后添加requiredfieldvalidators,可以轻松处理头两个可能发生的错误。requiredfieldvalidator只须简单确认经controltovalidate域鉴别后的服务器控件中有输入值:
< tr>
< td valign="top">
< asp:requiredfieldvalidator runat=server
controltovalidate = "txtusername"
display = "static"
errormessage="< b>*< /b>"
forecolor = "#cc3300" />
< /td>
< td valign=top>user name:< /td>
< td valign=top>
< asp:textbox id="txtusername" size=25 runat=server />< /td>
< /tr>
这种方案是如此简单以至我们决定在把requiredfieldvalidator添加到所有的表格输入域中。在asp中,我们通常会用一个vbscript函数来检验输入值,而现在我们只需把requiredfieldvalidator添加到每个我们想确认的控件中去。
至于密码与密码确认的比较,我们可以使用asp+的comparevalidator。该控件允许我们设置controltovalidate,controltocompare以及operator属性(在本例中是一个等于号,即equal)。被指定的两个控件用operator(即操作符)属性互相比较。与传统的if…then语句相比,这种方法明显要简单,快捷:
< asp:comparevalidator runat=server
controltovalidate = "txtconfirm"
controltocompare = "txtpassword"
type = "string"
operator = "equal"
display = "dynamic"
errormessage="< b>*< /b>"
forecolor = "#cc3300" />
基于不同的浏览器,asp+ validator控件会相应执行客户端的javascript验证(针对ie4.0以上版本),或者执行服务器端验证(针对其它情况)。不论验证是如何执行的,服务器端的验证是必不可少的(以阻止某些淘气的家伙在客户端验证上耍花样)。
现在轮到最后一个错误了。假如提交的用户名已经存在,这就要求一点点页面的改动。到目前为止,我们已经用可以执行服务器端与客户端验证代码的服务器控件完成了所有的asp+验证。至于最后这个错误,我们要提供一些自定义的服务器端验证,因为我们需要访问数据库以了解被请求的用户名是否已存在。我们可以利用asp+ customvalidator控件来解决这一问题。
