1、ASP Validator 简介 [ 顶端 ]
ASP Validator 是基于 ASP 的一个验证类,用于服务器端验证。比如,验证表单中一个文本框(假设元素名为 UserEmail)的值是否为正确的电子邮件格式,按传统的方法您可能会编写这样的代码:
| 程序代码: | [ 复制代码到剪贴板 ] |
strEmail = Trim(Request.Form("UserEmail")
Set objRegExp = New RegExp
With objRegExp
.Global = False
.IgnoreCase = True
.Pattern = "^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$"
End With
If objRegExp.Test(strEmail) = False Then
Response.Write("非法的电子邮件格式")
Set objRegExp = Nothing
End If
而使用 ASP Validator 时您可能会编写如下代码:
| 程序代码: | [ 复制代码到剪贴板 ] |
Set objValidator = New Validator
objValidator.Add "UserEmail", "Email", "非法的电子邮件格式", ""
If Not objValidator.Validate Then
Response.Write(objValidator.Err)
Set objValidator = Nothing
End If
上例中,虽然传统方法更显得直观,而且代码行数也没多多少,但是在实际应用中,经常会碰到对多个表单元素进行多种规则验证的情况,这时您不得不为每一个元素的每一种验证规则编写代码,虽然可以通过将常用函数写进包含文件的方式来减轻劳动强度,但仍需要花费大量的时间和精力来编写重复的代码片断(起码您需要写无数个 Request.Form("")、If Then 、……)。这时,使用 ASP Validator 的优越性便体现出来了。
上例中,我们使用了 ASP Validator 的 Add 方法、Validate 方法和 Err 属性。使用 ASP Validator 时,我们先通过 Add 方法添加需要验证的规则,然后通过 Validate 方法执行验证并得到验证结果,最后通过 Err 属性得到出错信息(如果有的话)。在 ASP Validator 中,我们把整个验证任务分解成若干条“规则”,通过 Add 方法来添加规则。Add 方法的函数原型如下:
| 程序代码: | [ 复制代码到剪贴板 ] |
Add 方法包含四个参数:表单元素名、规则类型、出错信息、规则参数。在上例中,表单元素名为 "UserEmail",规则类型为 "Email",出错信息为 "非法的电子邮件格式",规则参数为空。
在 ASP Validator 中,我们将规则类型分为两种:正则类和非正则类。对于正则类规则,我们只需给出规则类型(比如 Email 规则),不需需要规则参数。而对于非正则类规则(如 Length 规则),我们可能还需给出规则参数,比如验证一个表单元素(假设为 UserName)值的长度是否在 6 到 12 字节之间(一个数字或字母算一个字节,一个汉字算两个),您需要编写如下代码:
| 程序代码: | [ 复制代码到剪贴板 ] |
上例中,我们为 Length 规则指定了规则参数 "6,12",它指示了 Length 规则的最小长度和最大长度。对于非正则类规则,您需要查阅 程序员参考 来获悉每一种规则的参数格式。比如,Length 规则的参数格式为 "n,m",n 和 m 分别代表最小长度和最大长度,如果省略则代表不限(即 ",6" 代表最长为 6 个字节,"4," 代表最小 4 个字节)。
现在 ASP Validator 支持如下规则类型:
| 规则类型 | 验证功能 | 备注 |
|---|---|---|
| BadWords | 脏字检测 | 非正则类型 |
| CheckIP | 检验IP是否在允许范围内 | 非正则类型 |
| Chinese | 中文 | 正则类型 |
| Currency | 货币格式 | 正则类型 |
| Custom | 自定义正则表达式 | 非正则类型 |
| Double | 实数 | 正则类型 |
| English | 英文 | 正则类型 |
| Equal | 等于某个值 | 非正则类型 |
| Integer | 整数 | 正则类型 |
| Length | 字符串长度 | 非正则类型 |
| Number | 数字 | 正则类型 |
| Phone | 电话号码格式 | 正则类型 |
| QQ号码 | 正则类型 | |
| Related | 是否同时有值/无值 | 非正则类型 |
| Require | 必填项 | 正则类型 |
| URL | 基于HTTP协议的网址格式 | 正则类型 |
| Zip | 邮政编码 | 正则类型 |
2、使用 ASP Validator [ 顶端 ]
例1:一个用户注册表单实例
| 程序代码: | [ 复制代码到剪贴板 ] |
<!--#include file="validate.cls.asp"-->
<%
Dim objValidator
Set objValidator = New Validator
With objValidator
.Add "UserName", "English", "用户名必须由纯英文字母组成", ""
.Add "UserName", "Length", "用户名长度必须在 6 到 12 位之间", "6,12"
.Add "UserPwd", "Length", "密码至少要 6 位", "6,"
.Add "UserPwdRetype", "Equal", "您两次输入的密码不一致", "{UserPwd}"
.Add "UserEmail", "Email", "您输入的电子邮件格式不对", ""
End With
If Not objValidator.Validate Then
Response.Write(objValidator.Err)
Set objValidator = Nothing
Response.End
Else
Response.Write("验证通过")
Set objValidator = Nothing
Response.End
End If
%>
'-----------------------------------------------Form.htm
<html>
<head>
<title>一个用户注册表单实例</title>
</head>
<body>
<form name="frmUserReg" action="Register.asp" method="post">
用户名:<input type="text" name="UserName"><br>
密码:<input type="password" name="UserPwd"><br>
密码再输一次:<input type="password" name="UserPwdRetype"><br>
电子邮件:<input type="text" name="UserEmail"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
例1 中我们使用了带 {} 标记的 Equal 规则,它表示与表单中某一元素的值相等,具体信息请参考 Equal 规则用法。Equal 规则还有更高级的用法:
例2:一个用户登录表单实例
| 程序代码: | [ 复制代码到剪贴板 ] |
<!--#include file="validate.cls.asp"-->
<!--#include file="md5.asp"-->
<%
'打开数据库连接
Dim objConn
Set objConn = Server.CreateObject("ADODB.connection")
objConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=..."
objConn.Open
Dim objValidator
Set objValidator = New Validator
With objValidator
Set .Conn = objConn
.Add "UserName", "English", "用户名必须由纯英文字母组成", ""
.AddElement "UserPwdMd5", md5(trim(request.form("Password")))
.Add "UserPwdMd5", "Equal", "用户名与密码不符", "SQL:SELECT Password FROM [Users] WHERE UserName='{UserName}'"
.Add "Check", "Equal", "您输入的验证码不对", CStr(Session("CheckCode"))
End With
If Not objValidator.Validate Then
Response.Write(objValidator.Err)
Set objValidator = Nothing
Response.End
Else
Response.Write("验证通过")
Set objValidator = Nothing
Response.End
End If
%>
'-----------------------------------------------Form.htm
<html>
<head>
<title>一个用户登录表单实例</title>
</head>
<body>
<form name="frmUserLogin" action="CheckLogin.asp" method="post">
用户名:<input type="text" name="UserName"><br>
密码:<input type="password" name="UserPwd"><br>
验证码:<input type="text" name="ChechCode"><img src="checkcode.asp"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
例2 中,我们使用了以 "SQL:" 引导的 Equal 规则参数,它表示与某一记录集(单列)作比较,如果在记录中能找到相等的值,则认为符合规则。此外,我们还使用了 AddElement 方法,它的作用是往 ASP Validator 中添加一个“虚拟”的元素,因为需要将用户提交的密码进行 Md5 加密,而 ASP Validator 并没有集成 Md5() 函数。当然,您也可以这么写:
| 程序代码: | [ 复制代码到剪贴板 ] |
.Add "Password", "Equal", "用户名与密码不符", "SQL:SELECT Password FROM [Users] WHERE UserName='{UserName}'"
Update 方法用来更新某一元素的值,详情请参考 Update 方法。
3、使用 ASP Validator 处理上传类表单 [ 顶端 ]
与自带的无组件上传类(修改自无惧上传类)配合,ASP Validator 能够处理上传表单(表单 enctype 属性为 multipart/form-data)。
例3:处理上传类表单
| 程序代码: | [ 复制代码到剪贴板 ] |
<!--#include file="upfile.cls.asp"-->
<%
Dim objValidator, objFileUp
'构造一个文件上传对象,并设置其属性
Set objFileUp = New UpLoader
objFileUp.MaxSize = 102400 '最大上传尺寸,单位:字节
objFileUp.AllowExt = "rar;jpg;txt" '允许上传的文件类型,用半角分号隔开,如果您想限制成不允许某类文件,还可设置 DisAllowExt 属性,参考后面的说明
'告诉 ASP Validator 这是一个上传类表单,类文件中已经包含此变量的定义,只须保证这句代码放在验证对象实例化之前
blnUploadForm = True
'实例化验证对象
Set objValidator = New Validator
with objValidator
'给验证对象指定一个文件上传对象,ASP Validator 会自动从这个对象中读取表单元素值,并自动获取出错信息
Set .FileUp = objFileUp
'这里可以增加表单中其它元素的验证规则,同前例
end with
If Not objValidator.Validate Then
Response.Write(objValidator.Err)
else
'保存文件
objFileUp.SaveFile "file1", Server.MapPath("/validator")&"", False
'此时可对上传文件时发生的错误进一步处理
If objFileUp.Err > 0 Then
Response.Write objFileUp.ErrMsg
Else
Response.write "OK"
End If
End If
Set objFileUp = Nothing
Set objValidator = Nothing
%>
说明
- 要处理上传类表单,表单 enctype 属性必须为 multipart/form-data
- 必须在验证对象实例化之前加上 blnUploadForm = True,它告诉 ASP Validator 这是一个上传类表单。因为上传类表单中的元素值不能直接读取,而且 Request 对象不能判断表单类型,如果您有更好的解决方案,请告诉我。注:validator.cls.asp 文件中已经包含此变量的定义。
- 文件上传类的属性:
MaxSize 最大上传尺寸,单位:字节。可读可写。不设置表示无限制。
Err 出错代码,只读。-1=无错; 1=没有文件上传; 2=上传尺寸超出限制; 3=扩展名非法; 4=保存的路径非法;
ErrMsg 出错信息,只读。
AllowExt 与 DisAllowExt 上传文件扩展名的白名单与黑名单,以半角分号分隔,白名单优先。 - 上传文件类的方法:
SaveFile 保存文件。
第一个参数表示表单中对应的元素名
第二个参数表示要保存的路径。除非保存成指定文件,一定要保证此参数最后一个字符为。Server.MapPath("/upload")&" est.txt" 合法,Server.MapPath("/upload") 非法,Server.MapPath("/upload")&"" 合法。
第三个参数表示是否自动更名(即保存成.txt这样的文件)。True 表示自动保存,False 表示采用表单中的文件名或第二个参数中指定的文件名保存。 - 此文件上传类原作者为梁无惧,孙立宇等人改进其安全性并更名为先锋上传类,我在先锋上传类的基础上做了改动,使之配合 ASP Validator 工作。我已经尽量注意安全性的处理,如果有朋友发现上传漏洞,请立刻告诉我,谢谢!
通过以上三个例子,相信您对 ASP Validator 有了一个大致的了解,并且马上能在项目中使用。如果您想仔细研究 ASP Validator 并扩展它的功能,请继续阅读下一节。当然,阅读 ASP Validator 的源码也是个好主意,事实上它很简单。
4、程序员参考 [ 顶端 ]
属性
方法
描述:设置数据库连接对象。当您使用 Equal 规则类型并使用以 "SQL:" 引导的规则参数时,必须设置此参数。
语法:
Set objValidator.Conn = objConn说明:objConn 参数总是一个可用的数据库连接对象。
描述:设置是否允许远程提交。
语法:
objValidator.RemoteSubmit = True | False说明:设置为 True 时允许远程提交,否则不允许。默认为 False。
描述:返回验证后产生的出错信息。
语法:
objValidator.Err
描述:添加规则。
语法:
objValidator.Add Element, RegType, ErrMsg, Para说明:Element 参数为应用该规则的表单元素名称;RegType 参数为规则类型;ErrMsg 参数为不符合规则时的出错信息;Para 参数为规则参数,正则类规则无需参数。参考下表:
| 规则类型 | 验证功能 | 参数 |
|---|---|---|
| BadWords | 脏字检测 | 脏字列表,以竖线"|"分隔 |
| CheckIP | 检验IP是否在允许范围内 | [IP]:Allow/Refuse 格式,多条规则以 ; 分隔 [IP]可以是单一IP,如: 也可以是IP段,如: 还可以使用通配符*,192.168.* 与 等价 注意:* 与 - 不能同时使用。 -192.168.18.20 也是合法的,相当于-.254 并 .* 并 多条规则如有矛盾,遵循“后来居上”原则,即后面的规则有较高优先级 示例:*:Allow;.*:Refuse;:Allow 表示除以外的.*都将被禁止,其它的都允许。 |
| Custom | 自定义正则表达式 | 自定义正则表达式 |
| Equal | 等于某个值 | 具体的字符串(多值请用 | 分隔) 或者 SQL:[单字段 SELECT 语句] 可用 {Element} 表示表单中某元素的值 |
| Length | 字符串长度 | n,m (n 和 m 分别代表最小长度和最大长度,如果省略则代表不限) |
| NotEqual | 不等于某个值 | 与 Equal 相同 |
| Chinese | 中文 | 正则类型 |
| Currency | 货币格式 | 正则类型 |
| Double | 实数 | 正则类型 |
| English | 英文 | 正则类型 |
| Integer | 整数 | 正则类型 |
| Number | 数字 | 正则类型 |
| Phone | 电话号码格式 | 正则类型 |
| QQ号码 | 正则类型 | |
| Related | 是否同时有值/无值 | 与该元素相关联的元素名称 |
| Require | 必填项 | 正则类型 |
| URL | 基于HTTP协议的网址格式 | 正则类型 |
| Zip | 邮政编码 | 正则类型 |
描述:添加虚拟的表单元素
语法:
objValidator.AddElement Name, Value说明:Name 为元素名,不能为空或者表单中已经存在的元素名;Value 为元素值。
描述:更新表单元素的值
语法:
objValidator.Update Name, Value说明:Name 为元素名,该元素必须存在;Value 为元素值。
描述:执行验证并返回验证结果
语法:
objValidator.Validate说明:本方法返回一个是否通过验证的布尔值,如果没通过,可以从 Err 属性取得出错信息。
5、常见问题与解答 [ 顶端 ]
- 问:ASP Validator 支持 Cookie、Session、Request.ServerVariables、以 GET 方式提交的数据验证吗?
答:是的,可以用 AddElement 方法添加任何字符串作为虚拟表单元素。以 GET 方式提交的数据可以直接使用。 - 问:ASP Validator 能处理 enctype 属性为 multipart/form-data 的表单吗?
答:是的。加上这么一句就行了:blnUploadForm = True。注意:必须确保此语句在 Set objValidator = New Validator 也即实例化之前。validator.cls.asp 已包含 blnUploadForm 的定义,因此不必在你的代码中 Dim blnValidator。
6、关于 ASP Validator [ 顶端 ]
- 感谢 我佛山人。他写的 Validator(Javascript写的客户端验证器)很实用,并让我萌发了写 ASP Validator 的动机。配合 Validator 使用效果更佳。
- 感谢我的兄弟BeginXtu、Ralfmmx。他们测试了 ASP Validator 并提了很多建议。
- 这是我学习 ASP 以来第一次写类,不足之处还恳请大家批评指正。ASP Validator 是免费的,您可以在任何场合中自由地使用它。如果您对它作了改进,请发邮件给我(Nowgoo at Gmail dot Com),谢谢!

| Tags (标签) | 引用通告地址 (0) |
| Tags: Asp |
http://www.gogogo8.com/ver2/Blog/trackback.asp?tbID=158 http://www.gogogo8.com/ver2/Blog/trackback.asp?tbID=158&CP=GBK |


编程开发
作者: Nowgoo 













