ASP编程范文
ASP编程范文(精选6篇)
ASP编程 第1篇
ASP.NET作为一个快速网站开发平台凭借其完善且强大的网站开发技术, 成为了目前国内应用最为广泛的语言之一, 也成为了很多动态网站开发者的首选。然而, 质疑ASP.NET安全性、稳定性的言论层出不穷, 运行于windows平台的ASP.NET网站不是因为安全度低, 而是开发者还没有系统地掌握ASP.NET安全技术。
2认证与授权
2.1 Form认证
对于Internet上不允许匿名访问的网站资源, 我们必须验证用户的身份, 基于表单的身份认证是ASP.NET中使用最多和最灵活的一种验证方式, 验证通过的用户便可以访问网站的资源, 我们通常的做法:
(1) 首先修改网站根目录中Web.Confi g文件的authentication节:
说明:不采用默认Cookie名称的方式, 不给非法用户获得自动保存的登录凭据cookie的机会;缩短cookie的生存时间, 以减少非法用户获取cookie骗取应用程序的时间。
(2) 其次在网站根目录中Web.Confi g文件的connection Strings节中创建数据库的连接字符串:
说明:不使用SQL默认的sa账号;一定要使用强密码, 以此保证数据库的安全。
(3) 用户登录页面 (假设为Login.aspx) 进行身份验证的部分关键代码:
(4) 用户登录后的凭据会以Cookie的形式进行保存, 当我们同时访问其他网站的时候, 恶意网站便可以截取Cookie凭据, 以合法用户的身份向我们的网站服务器发送请求, 合法用户的资料将会受到极大的威胁, 这就是CSRF跨站请求伪造攻击。为了验证用户的合法性, 应该确保发送验证请求的表单是由我们的服务器发出的, 常用的解决方法为:给用户提供一个输入验证码的文本框, 通过每次与我们服务器表单产生的随机验证码比较, 做到CSRF跨站请求伪造攻击防范。
2.2授权
授权是对认证通过的用户进行的权限限制, 类似windows中的用户组的概念, 我们称之为角色, 不同角色下的用户可以访问不同的网站资源。我们假设网站中有两种角色:Administrator和Registusers, 只有管理员 (Administrator) 才可以访问Admin文件夹中的资源, 管理员和注册用户 (Registusers) 都可以访问Users文件夹中的资源。我们的做法是:
(1) 在网站中建立两个文件夹, Admin和Users, 并分别建立或放置基于角色权限访问的页面或文件。
(2) 在Admin文件夹中, 添加Web.confi g文件, 并在其<authorization>节中, 添加如下参考代码:
(3) 为了便于检验验证和授权的效果, 我们可以提前通过注册页面, 录入两条分别属于管理员角色和注册用户角色的用户信息, 密码写入数据表users之前一定要通过MD5加密。
(5) 在Global.asax文件的Application_Authenticate Request事件中, 将当前用户的标识与当前用户登录验证票据中保存的用户角色进行匹配:
3错误信息处理与信息加密
3.1错误信息处理
网站运行过程中, 出现未处理的错误是常有的事, 如果这些错误信息被恶意用户获得, 经过一定的分析处理, 网站中的重要程序代码信息将有可能泄露, 这将成为恶意用户攻击网站的开始。通常可以采纳以下几种策略:
(1) 配置网站根目录中Web.Confi g文件的custom Errors节, 如:
(2) 在程序编码过程中, 将可能出现错误的代码块放置在try…catch…fi nally语句中, 以捕获程序运行过程中出现的异常, fi nally结构中通常放置关闭数据库连接等操作语句。
(3) 在Global.asax全局应用程序类文件的Application_Error事件中, 判断Request.Is Local的值, 对本地用户 (值为true) , 通过Server.Get Last Error () 获得程序运行的错误信息;对远程用户 (值为false) , 自定义提示信息。分别给Application变量进行赋值。
任何一个html页都有一个_viewsate隐藏域控件, 用于保存网页提交后的原有控件的状态。虽然viewstate中的数据, 已经经过了base64编码, 但是恶意用户可以很容易的对编码后的数据进行解码。加密viewstate数据成为了其中之一的解决方案, 在网站的Web.confi g文件的<system.web>节中, 添加如下参考代码:
<pages view State Encryption Mode="Alwa ys"enable View State Mac="true"></pages>
<!—加密网站中的所有页面的viewstate数据-->
<machine Key validation="3DES"/><!—将加密方法改为3DES-->
3.3加密Web.config配置文件
在web.confi g配置文件中保存有网站配置的一些敏感性数据, 将其进行加密是一种不错的安全解决方式。基于可以读取加密信息的考虑, 需要做两项准备工作:
(1) 通过System.Security.Principal.Windows Identity.Get Current () .Name语句, 来读取应用程序标识。
(2) 通过aspnet_regiis–pa RSA密钥容器的名称 (通常为:Net Framework Confi guration Key) 应用程序标识, 使RSA密钥容器具有对加密信息读取的权限。
最后便可以通过aspnet_regiis–pe"配置文件中的节名"-app"应用程序标识", 加密指定配置节中的数据。
4资源权限设置与运行环境保障
4.1资源权限设置
虽然在Web.confi g文件中可以定义基于角色的访问权限, 但是如果在IIS中, 允许用户有浏览文件夹的访问权限, 我们网站的数据安全性依然得不到保障, 因此在IIS中创建虚拟目录时, 采用IIS对文件夹的默认访问权限, 无疑是一种不错的安全方案, 千万不要放开文件夹的浏览、文件的执行权限等等。另外, 对于采用Form验证方式的网站来说, 用户的匿名访问权限一定要放开, 因为基于用户名和密码的身份验证是在登陆页面中进行的, 不启用匿名访问, 用户连登陆页面也将无法访问。
4.2运行环境保障
作为Web服务器的计算机, 不能轻易让用户进入, 是保障网站安全性的基础。常用的做法有:使用NTFS文件系统比FAT32安全性高的多;关闭非需要的安全性隐患端口和未用的服务;安装杀毒软件和防火墙, 做到及时软件升级和系统补丁更新;使用不宜破解的计算机强密码, 防止非法用户各种尝试性登陆;经常进行网站备份和数据库备份等等。
5结论
网站安全性的技术是网站安全的保障之一, 最重要的是, 我们一定要提高网站安全防范意识, 通过在网站中设计用户的操作日志, 来时时监控网站的运行状态, 一旦发现非法用户进入或各种操作异常, 需要及时果断采取补救措施, 保证网站稳定、高效的运行下去。
参考文献
[1]赵强, 张红中.“基于ASP.NET的网站系统安全性设计与实现”[J].计算机应用, 2008 (12) .
[2]秦剑波、雷明彬.“ASP.NET网站设计安全性探讨”[J].商业视角, 2007 (11) .
[3]Jesse.“开发ASP.NET MVC应用程序时值得注意的安全问题”http://jesse2013.cnblogs.com/, 2013 (10) .
ASP 3.0高级编程二 第2篇
使用Form和QueryString集合当用户填写页面
可通过访问ASP的Form集合来访问其控件内的值:
strFirstName = Request.Form(“FirstName”)
strLastName = Request.Form(“LastName”)
也可使用窗体中控件的整型索引,索引的范围从在HTML中第一个定义的控件开始,然后根据定义的顺序排序:
strFirstName = Request.Form(1)
strLastName = Request.Form(2)
然而,后面的这种以整型为索引的技术不推荐使用,因为一旦有HTML中的控件发生了变化,或者插入一个新的控件,则ASP代码将得到错误的值。进一步而言,对于阅读代码的人来讲,极容易混淆。
1) 访问集合的全部值
可以通过引用集合把整个Form上的一系列值变成单个的字符变量,且不用提供键或索引。
StrAllFormContent = Request.Form
假如文本框包含值Priscilla和Descartes,则Request.Form语句将返回下列字符:
FirstName=Priscilla&LastName=Descartes
注意,提供的值是以名称/值对的形式出现的(即控件名称=控件值),并且每一对名称/值相互之间是用符号“&”相分隔的。假如打算把窗体中的内容传递单独的,希望得到值的标准格式的可执行应用程序或DLL,这个技术是很有用的。然而,一般说来,都是通过以窗体中控件的名称为文本键来访问集合中的内容。
2) 遍历一个ASP集合
有两种方式遍历一个ASP集合中的所有成员,方式与普通VB集合的基本相同。每个集合提供一个Count属性,返回的是集合中条目数量。可通过使用一个整型索引使用Count属性来遍历。
For intLoop=1 To Request.Form.Count
Response.Write Request.Form(intLoop) & “
”
Next
假如先前的窗体包含Priscilla和Descartes值的两个文本框,将得到如下结果:
Priscilla
Descartes
然而,更好的方法是使用For Each...Next结构。
For Each objItem In Request.Form
Response.Write objItem & “=” & Request.Form(objItem) & “
”
Next
这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果:
FirstName = Priscilla
LastName = Descartes
注意,一些浏览器返回到ASP的
在Form集合中,将为“OtherHobby”创建一个条目。然而,它将包括从三个文本框中得到的值。假如在提交时,用户留下了一个或多个为空,则返回的值为空字符串。假如用户在第一和第三个文本框分别输入Gardening和Mountaineering,第二个文本框为空,在我们的ASP代码中访问Request.Form(“OtherHobby”),将返回字符串:
Gardening, ,Mountaineering
为了能够在这种情况下,访问单个值,可以用复杂一些的代码:
For Each objItem In Request.Form
If Request.Form(objItem).Count >1 Then ‘More than one value in this item
Response.Write objItem & “:
”
For intLoop = 1 To Request.Form(objItem).Count
Response.Write “Subkey” & intLoop & “value =&
nbsp;“_
& Request.Form(objItem) (intLoop) & “
”
Next
Else
Response.Write objItem & “ = ” & Request.Form(objItem) & “
”
End If
Next
对于前面的包含三个OtherHobby控件的窗体实例,这将返回:
OtherHobby:
Subkey 1 value = Gardening
Subkey 2 value =
Subkey 3 value = Mountaineering
然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。
a) HTML中的单选或选页按钮控件
在HTML中,需要给几个控件相同的Name属性的情况是单选(或选项)按钮,例如:
因为用户只能选择多项中的一个(这就是给它们相同的名字的原因),将仅得到一个返回值,浏览器只能发送所选择控件的值。因此,假如这个窗体的用户已经选择了“Europez”,将得到这个条目,通过遍历Form集得到其值:
Country = EU
由于为每个控件提供了不同的VALUE属性,反映了每个条目所对应的国家或地区的名称。假如省略了VALUE属性,浏览器将返回的值为“on”,因此将得到:
Country = on
这是不经常用到的,因此一般对使用相同名称的单选控件使用VALUE属性。
b) HTML复选框控件
当一个窗体中HTML源码包含一个复选框控件时,一般都给定唯一的名称,例如:
在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中(加标记),遍历Form集合时,会得到下列值:
Reading = on
Sleeping = on
然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串“on”。例如窗体如下:
如果除第三个复选框外,全部提交,在Request.Form集合会产生下列结果:
Hobby = Hobby025, Hobby003, Hobby010
假如编写更复杂一些集合遍历代码,如先前所述(单独显示每个子键),就得到这样结果:
Hobby:
Subkey 1 value = Hobby025
Subkey 2 value = Hobby003
Subkey 3 value = Hobby010
需要注意的是两种情况,没有选中的控件根本不返回任何值。在第一种情况的结果里,没有欺骗性的逗号,第二种情况也没有空值。这与上述的使用文本框的相当的.测试的结果不一样。使用文本框时,每个文本框都返回一个值,即使是一个空字符串。这是浏览器造成这样的结果。因此在ASP代码中访问集合时,要注意这个问题。
上述情况一个棘手的负作用是使用复选框时,复选框值的索引与在原始的HTML中控件的位置没有任何联系,在上述的例子中第四个复选框的子键数为3,因为当窗体提交时,第二个控件没有选中。
c) HTML列表控件
HTML中的 CT>标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示。下列的窗体创建了包含5个值可供用户选择,由于包含了MULTIPLE属性,因此可以通过选择时按下Shift或Ctrl键,选择不仅一个的条目。 下图所示为该页面,显示的是选中了三个条目。 这种特殊的情况返回的是在Form集合中单个条目,它包含选择的值(单个的 Hobby = Hobby025, Hobby003, Hobby010 假如使用更加复杂一些的集合遍历代码(单独显示每个子键),将得到: Hobby: Subkey 1 value = Hobby025 Subkey 2 value = Hobby003 Subkey 3 value = Hobby010 这与上述相同名称的复选框的情况相同。事实上可以认为一个SELECT列表是一列复选框的列表供选择(不是选中)相应的条目。 然而,列表框也有指定的值,假如在 Hobby = Swimming, Reading, Sleeping 并且,同样,复杂一些的集合遍历代码将返回如下结果: Hobby: Subkey 1 value = Swimming Subkey 2 value = Reading Subkey 3 value = Sleeping 当然,假如单个项目被选择,且在 Hobby = Hobby025 如果没有提供VALUE属性,得到: Hobby = Swimming 这允许既可以缺省(即无VALUE)显示选项文本,也可做相应的改变。后一种情况在某些情况下是极为有用的,如要显示(一个说明的字符串)和传递一个完全不同的内容(如用一个短码代表一个说明性的字符串)。 d) HTML提交和图像控件 复选框和单选框是布尔型控件的例子,选中或选择返回的为“on”,不像文本框和大多数其他的HTML控件,浏览器不包含没有选中或没有选择的控件的值。 还有另外一种常用的布尔型控件,称为HTML按钮。如、、、和类型。 BUTTON类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗体的Submit方法,浏览器在任何请求中将不包含BUTTON类型控件的值。同样,一个按钮的值也决不会发往服务器。 然而,输入按钮控件SUBMIT和IMAGE类型实际提交窗体给服务器,其VALUE属性包含窗体的其他控件的值(只要在HTML定义中包含一个NAME属性)。例如,这个窗体可能是向导类型Web应用程序的一部分,允许用户一步步进行或取消进程: 在一个窗体中,可以包括多个SUBMIT按钮。在这种情况下,应该给每一个按钮唯一的VALUE属性,如上所示。当一个窗体被提交时,遍历Request.Form集合的值,将产生一个值,这个值依赖于按下哪个按钮用于提交这个窗体。假如用户按下的“Previous”按钮,将得到: btnSubmit = Previous 因此,可查询Request.Form集合来决定下一个显示的页面,例如: Select Case Request.Form(“btnSubmit”) Case “Next” Response.Redirect “page_3.asp” Case “Previous” Response.Redirect “page_1.asp” Case “Cancel” Response.Redirect “main_menu.asp” End Select 同时,也可根据需要对每个按钮使用不同的NAM E属性。且选择其值包含在Form集合中的控件名称。在控件没有一个完整的标记而是随后跟着较长的文本标签的情况下,极为有用,如下图所示。 此屏幕上的界面由下列代码产生: 在ASP页面中,接收到数据后,可以检查按扭名称提供的值来判断按下的是哪个按钮。 If Len(Request.Form(“btnNext”)) Then Response.Redirect “page_3.asp” If Len(Request.Form(“btnPrevious”)) Then Response.Redirect “page_1.asp” If Len(Request.Form(“btnCancel”)) Then Response.Redirect “main_menu.asp” 这个工作是查询一个键上的ASP集合,如果不存在则返回一个空的字符串。换句话说,如果第二个按钮(previous页)按下,则Request.Form(“btnNext”)的值是一个空字符串,则其长度为零而不至于产生一个错误。当第二个按钮按下时,则在Form集合中这个条目的值Request.Form(“btnPrevious”),将是“ ”其长度大于零。 e) 提高使用Request集合的效率 访问一个ASP集合来下载一个值是费时的需计算资源的过程,因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用集合中的一个值,应该考虑将其存贮成为一个局部变量,例如: strTitle = Request.Form(“Title”) strFirstName = Request.Form(“FirstName”) strLastName = Request.Form(“LastName”) If Len(stTitle) Then strTitle = strTitle & “ “ If strFirstName = “ “ Then StrFullName = strTitle & “ “ & strLastName ElseIf Len(strFirstName) = 1 Then StrFullName = strTitle & strFirstName & “・ “ & strLastName Else StrFullName = strTitle & strFirstName & “ ” & strLastName End If f) 搜索所有的Request集合 在某些情况下,可能知道一个值的键名将出现在Request集合中,但不能准确地知道是哪一个集合。例如,假如有几个页面(或一个页面的不同段)发送一个值给同一个ASP脚本,它可能在Form或者QueryString集合中出现。 本章后面部分将研究Form和QueryString集合的差异。 要看一下一个值为什么可能出现在不同的集合中,考虑一下这种情况:使用了超级链接元素请求一个页面。在这种情况下,增加一个值到请求的唯一方法是把它加到URL上。然而,同样的值可能已出现在另一个页面的 ... ... For help go to the Help Page ... 在这种情况下,按下窗体上的Help按钮,将发送Request.Form集合中一对名称/值“page=Help”。然而,按下超级链接也可能发送名称/值“Page=Help”,但是这次却是在QueryString集合里。为访问这个值,可使用ASP Request对象的一个特殊功能: strPage = Request(“page”) 这将按序搜索全部的集合――QueryString、Form、Cookies、ClientCertificate、ServerVariables,直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。 例如,可能希望搜集满足客户请求的Web服务器的名称,这通过出现在每个查询中的Request.ServerVariables集合中寻找“SERVER_NAME”来实现。然而,假如任一其他的集合也包含名为“server_name”的值(记住键名不区分大小写),当使用Request(“server_name”)时,得到的是错误的结果。使用Reqeust.ServerVariables(“server_name”)句法,我们将很难进行错误追踪。 总而言之,使用“搜索全部集合”技术要格外小心,且只在没有其他技术能够提供你需要的结果时使用。 g) 访问其他的集合 本章的这一节里,已经集中讨论了Form集合,这可能是使用得最多的一个。然而,所有这些技术同样适用于其他的对象。包括那些由Request对象提供的(即Form、QueryString、Cookies、ServerVariables和ClientCertificate)集合,及由Response对象提供的cookies(及将在下两章遇到的其他对象提供的集合)。 我们将简短了解一个值如何进入一个QueryString集合,及其优点和不足。然而,同时这两个Cookies集合有额外的功能,可以使使用cookie更加方便,下面讨论这个内容。 ★ 编程辞职信 ★ 编程问答题 ★ 第一次编程作文 ★ 编程程序员年终总结 ★ 资格考试《高级会计实务》考试总复习一 ★ 高级会计师之财务战略与财务分析一 ★ 高级会计师资格考试之资金管理分析一 ★ 高级技术职称 ★ C/C++编程个人简历 1 系统流程设计 系统依照医疗设备维修的周期进行设计。当医疗设备出现故障, 使用科室登录系统申请报修, 记录故障现象, 并给出故障处理响应级别, 提交后生成维修基础数据、显示待修状态, 系统自动给出报修提示, 通知维修科室处理, 维修工程师确认后, 记录显示修理状态, 故障排除后, 填写维修记录, 记录显示维修结束状态, 使用科室给出评价意见, 整个维修周期结束。系统工作流程, 见图1。 2 系统结构设计 系统各功能模块的设计主要基于医疗设备维修的各个环节, 主要包括设备报修、维修记录、保养提醒、报表统计、信息查询、保修管理、巡视记录等。系统结构体系, 见图2。 2.1 用户管理模块 根据使用人员角色的不同, 分配不同的使用权限, 如系统管理员、使用科室、维修人员、管理人员等。 2.2 设备管理模块 设备管理模块主要用来编辑设备的基本信息, 如设备的名称、型号、厂家等, 同时给每台设备设置唯一编码, 设备的维修、保养、保修等内容都通过该编码进行管理, 便于日后查询以及数据统计。 2.3 信息查询模块 该功能模块可以实现在维修记录里按设备名称、设备型号、使用科室、维修时间、维修人员等进行查询, 当医疗设备发生故障时, 维修人员快速查阅相关记录, 参考相似故障处理方法, 可以提高故障的处理效率。同时, 使用人员也可以通过查看设备的维修资料, 以加强设备相关方面的维护与保养。 2.4 报表统计模块 通过报表统计模块, 设备管理人员可以按照单个设备、设备类别、使用科室、时间段等来统计设备发生故障的次数、维修费用等信息。 2.5 保修管理模块 每台医疗设备购置时都有一定的保修期, 通过该模块可以设定保修期期限, 并提前给出报警提示, 便于重要设备办理延保手续。同时, 在设备报修申请单上显示是否在保修期内, 如果设备属于保修期内, 联系厂家维修, 否则维修人员进行维修[4]。 2.6 保养管理模块 医疗设备的维修方式通常分为事后维修、预防性维修[5]。本模块主要针对预防性维修, 根据医疗设备的使用频率, 以及设备自身的维护保养要求, 通过保养提醒模块设置保养周期, 提前给出报警提示, 通知设备维护人员, 确认报警后, 自动生成保养记录单。 2.7 设备报修模块 当医疗设备出现故障时, 登录系统, 选择设备保修菜单, 系统生成设备报修申请单, 包括申报日期、申报科室、设备编码、故障现象等内容。 2.8 维修记录模块 维修人员登录系统, 确认设备报修申请后, 自动生成维修记录单, 内容包括:维修开始和结束时间、故障原因、维修内容、维修费用、更换物件, 维修人员、设备名称、设备型号、设备厂家及联系方式、设备保修情况等, 为日常学习提供资料, 以防日后发生类似的状况[6]。 2.9 维修评价模块 当工程师处理设备故障结束并提交维修记录单后, 系统生成维修评价表, 并在设备使用人员的系统界面给出报警提示, 设备使用科室根据维修情况给出评价并确认维修结束, 数据可以作为维修人员的业绩考核参考。 3 系统的开发 3.1 运行环境 系统在微软的Windows 2000系统和Windows XP系统下均可工作, IIS是执行ASP的环境[7], 要正确配置好IIS服务。 3.2 开发工具 系统采用ASP网络语言编写, ASP是微软公司开发的一种应用, 它可以与数据库和其它程序进行交互, 是一种简单、方便的编程工具, 可以开发出动态交互性极强的网络系统。因为数据量不大, 我们采用微软的ACCESS数据库, 便于安装维护, 降低成本。 3.3 部分源代码介绍 软件系统的操作基本都需要与数据库进行传输数据, 为了减少代码的编写, 把ASP与数据库的连接代码编写成独立文件, 命名为conn.asp, 以便其他文件调用。部分代码如下: 当有文件需要操作数据库时, 只要在该文件的代码起始处添加:语句, 即可进行数据库相关操作, 避免数据库连接代码重复编写。 保修管理模块是针对每台设备的保修期限进行预警, 当设备保修期快结束时, 系统给出报警提示, 提醒对重要设备的延保等处理工作。部分代码如下: 4 结语 通过使用医疗设备管理系统, 方便了对医疗设备的维修管理[8], 使医疗设备维修管理更加规范化, 降低设备维修成本, 大幅提升设备的维修效率和质量。同时, 医院管理人员更加透明地了解医疗设备的运行情况, 为今后医疗设备的采购提供有力依据。 摘要:目的 设计一套医疗设备维修管理系统, 加强医疗设备维修管理。方法 应用现有的网络资源, 依托ACCESS数据库, 选用B/S架构、使用ASP编程, 开发医疗设备维修管理系统。结果 系统实现了医疗设备维修网络化管理, 优化了维修操作流程, 满足了医院设备维修管理需求。结论 系统的应用提高了医疗设备维修的工作效率和管理水平。 关键词:医院信息系统,医疗设备维修管理,ASP编程,网络化管理 参考文献 [1]张文才, 冉建鹏, 谢京启.浅谈医学工程科设备报修系统开发工具的选择[J].医疗装备, 2010, 23 (7) :83. [2]朱彤辉.使用VB开发医疗设备维修管理系统[J].中国医疗设备, 2011, 26 (4) :40-42. [3]冉建鹏, 任春海, 谢京启.医学工程科设备报修系统的开发与应用[J].医疗装备, 2010, 23 (5) :35-36. [4]曾立.医院综合维修管理系统的设计与应用[J].中国医疗器械杂志, 2011, 35 (2) :117-118. [5]童斌.医疗设备维修管理的几点问题与对策[J].医疗卫生装备, 2010, 31 (1) :91-92. [6]刘文, 李敏燕.浅谈医疗设备管理[J].现代医学仪器与应用, 2007, 19 (4) :37-39. [7]粱丽.在Windows XP环境下配置IIS[J].数字技术与应用, 2010, (10) :120. 学好一门编程语言有两个条件是必不可少的,一是理论和实践结合,在实际例程去验证书本上的理论能加深你对理论的理解;二是学会总结,把学习、运用中的心得体会记下来,当成一种经验或教训加以提炼并在日后的应用中加以改进,一定能提高你对这门编程语言的认识。以下是笔者在学习和运用ASP编程中的两点经验,希望能对大家有所帮助。 ASP页面内VBScript和JScript的交互 ASP具有管理不同语言脚本程式的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数。ASP研发环境提供了两种脚本引擎,即VBScript(缺省)和JScript。不过,研发者并没有被限制于只能使用这两种语言,只要能够提供合适的ActiveX脚本引擎就能使用所有脚本语言。 脚本语言的选择往往基于许多不同原因:他可能是研发者最为熟悉的语言,可能是对给定工程来说能够提供最多特色支持的,也有可能是最具效率的。不同的环境和需求使得我们在选择脚本语言时注重不同的因素,同时也使得我们在某些时候面临选定的脚本语言不能直接提供其他语言固有的函数这一问题,或某个脚本已写成但用的却是另外一种脚本语言。 此时应该怎么办?是否需要用当前所用的脚本语言重写这些脚本?或说,是否有可能在一种脚本语言中调用其他脚本语言的内置函数?本文要说明的就是在ASP应用中怎么让VBScript脚本和JScript脚本交互以最大限度地获得两种脚本语言的特色支持。 一、VBScript和JScript的内置函数 在VBScript和JScript中,有大量的内置函数功能是相同或类似的。然而,在一种脚本语言中内置的函数并非总是在另外一种脚本语言中也有对应的函数。例如,VBScript提供了许多用于操作字符串和格式化数据的函数,这些函数在JScript中并不存在。这些函数包括StrReverse()、Filter()及FormatCurrency()等。在另一方面,JScript所提供的用于管理数组、字符串编码等的函数在VBScript中也没有定义,如join()、reverse()、pow()、位操作、escape()和unescape()等。 那么,如果在JScript程式中需要一个VBscript函数该怎么办呢? 二、异种脚本的互相调用 如果需要在JScript脚本中调用一个VBScript中内置的函数,则应该写一个VBScript用户定义函数(在这里调用VBScript内置函数),然后在JScript脚本中象调用公用JScript函数相同调用这个用户定义函数。 例如,如果要调用的VBSCript内置函数是FormatCurrency(),则能声明如下自定义函数: < SCRIPT LANGUAGE=“VBSCRIPT” RUNAT=“SERVER”> Function FormatValue(Value) FormatValue = FormatCurrency(Value)End Function < /SCRIPT> 接下来在JScript代码中就能象普通JScript函数相同调用FormatValue()了。用类似的方法也能实现VBScript代码调用JScript函数。 应用同样的规则,我们能在所有脚本内调用所有用户定义函数。不过,从JScript脚本内调用一个不带参数的VBScript过程(Sub)时应略加注意,此时在JScript中应该象调用一个不带参数的JScript函数相同调用他,如用foo()调用VBScript Sub foo过程。 三、数据共享 在某些情形下混合运用VBScript和JScript函数是非常有用的,但在不同语言脚本之间共享数据也可能非常有用。实现这种共享的方法非常简单:不管使用的是什么语言,只要是在页面级声明的变量就能任意引用。 对象的使用方法也相似,能任意选用合适的语言读取、修改属性或调用对象的方法。当然给定对象的属性和方法是由创建该对象实例的语言所定义的。正如上例VBScript的过程调用,当从JScript中调用一个不带参数的VBScript对象的方法时,其调用方法也遵从JScript的调用规则,反之亦然。 四、数组管理 数组共享问题稍微复杂一点。虽然数组也象其他变量相同能在不同语言脚本之间共享,但必须注意兼容方面的问题。 VBScript数组在JScript下能用VBScript的符号引用,即用myArray(2)引用数组元素而不是JScript的数组元素引用符号myArray[2]。此外,还能使用一个特别的JScript对象??VBArray对象将VBScript数组转换为JScript数组。下面的代码从VBScript数组myVBArray创建JScript数组myJSArray: var Temp = new VBArray(myVBArray) var myJSArray myJSArray = Temp.toArray() 上述代码首先创建一个临时的VBArray对象,然后使用他的toArray()方法将自己转换为JScript数组。此后就能象普通JScript数组相同使用myJSArray,如myJSArray[1]。但应当注意的是,toArray()方法将把一个多维的VBArray转换为一维的JScript数组。 从VBScript中引用JScript数组更为复杂。虽然在VBScript中我们能直接访问JScript数组相关的方法和属性,但没有直接访问JScript数组的单个元素的方法。也就是说,我们能在VBScript脚本中读取JScript数组的长度属性,如下所示: x = myJSArray.length 但无法直接读取该数组的单个元素,下面的VBScript代码是不正确的: x = myJSArray(3) 解决该问题的一个可行的方法是执行一个转换过程,如下面的代码所示,此处假定VBScript是缺省的脚本语言: < % Dim Temp Dim myVBArray Temp = myJSArray.join(“, ”) myVBArray = Split(Temp, “, ”)%> 此处的JScript join()方法将数组myJSArray元素转换到一个以逗号为分割符的字符串,VBScript Split()函数将字符串转换为VBScript数组。注意这里我们是在VBScript环境下调用JScript的join方法。依照此例,我们能通过自定义VBScript函数来模拟JScript的VBArray对象的toArray()方法以实现JScript数组到VBScript数组的转换。 用模板建立动态ASP页 对于模板,我想大家可能都有一些概念,在word中非常多模板,设计好了大概的版面,你只要用你自己的话填充那些占位字符就好了。这儿的模板大概也就是这个意思,页面中相对稳定的部分固定下来,其他的部分根不同的情况在输入不同的内容。其实在DreamWeaver中也有模板的功能,不过那个静态的,只能手动填充内容,而这儿讲的是动态的自动的内容填充。 首先,我先来解释一下为什么要用到模板文件。有时候,模板能够带给你对网页功能和布局更为完整的概念。当你看到Word的模板格式之后,就知道最后版面是个什么样子的了,在这儿也是如此。例如,你能保留ASP语句,而使用不同的模板来建立不同的页面风格。 这样,你就不用为每种不同风格的网页分别来写不同的ASP页面了,这显然能为我们节省非常多时间和精力。而且,模板文件能够让你更容易的浏览页面代码,不用担心ASP和HTML的混杂搞的你头昏脑胀。你能只用把注意力集中在HTML上,而完全不用去管ASP了。再有就是,摸板非常简单,你绝对非常快就能搞懂搞定。在这篇文章中,将会用到一个数据库??一个用的非常广泛的雇员表。包括雇员ID,姓名,照片,及工作摘要和照片的注脚。下面是这个Access数据库的结构: 文件名Employees ID 自动计数(Autonumber)FullName 文本最多255个字符 Duties 注释类型 PicCaption 文本-最多50个字符 一个非常简单的数据库,是吧。当然你能按需求来扩展他,那就是你自己的事了。我假设你已了解数据库的基本操作,这样我不用在这上面花太多的笔墨,其实这儿的代码都是非常简单的,只要你知道一些基本的东西,就能把他看懂。建立了数据库之后,我们能开始建立模板文件了。这个文件是每个页面的骨架。我没有用到表格,那样有些麻烦,而我非常懒,而且,也不用加入,标签,因为那是要加在ASP页面中的。所以到最后,他的样子就是这样了: Full Name: %name% < br>Description of duties: %duties% This picture was taken: %date% Employee ID: %empID% 就是这样了!这就是个简单的模板。把他存为template.tmp,在后面的ASP页面中将要引用到他。要注意的是:我们能在模板中加入各种HTML标签,你完万能在摸版中定义好网页的结构和样式,就像实际写一个网页相同,只是要把关键的地方标出来??注意到了那些%围着的东西了吗?那就是模板的精髓了。或许你已注意到,那些%围着的是和数据库中的字段意义对应的。看看下面的ASP代码,是怎么读入模板和数据库文件,把他们揉和在一起,然后输出我们想要的HTML页面。 关键词:Membership API,安全管理,角色权限,访问规则 0 引言 ASP.NET应用程序是一种开放式的B/S架构应用程序,但这种开放式的访问方式无疑会给程序的安全运行带来一定的隐患。在用VS2010开发asp.net网站程序时,可以用系统自带的登录控件及“asp.net网站管理工具”来实现网站程序的安全管理,此方法简单,但在网站发布及灵活性方面存在诸多不便,以及在一些复杂的应用环境中,仍然需要通过编写程序来实现特定的网站安全管理。如何以更加有效、灵活的方式实现网站安全管理,是创建B/S应用程序时必须要认真考虑的一个重要问题。 1 传统的网络安全认证方法 与传统的C/S架构应用程序不同,ASP.NET应用程序由一系列单独的网页组成,如果没有必要的安全设置,任何一个用户都可以直接通过网页的URL访问页面,则安全无从谈起。 在传统的asp及asp.net用户身份认证中,一般采用Session对象保存用户登录状态和用户角色等信息[1]。当用户访问除了登录页面之外的其它页面时,程序首先检测Session对象中保存的数据,如果Session中保存的数据不正确,则跳回登录页面,如果正确,则从Session中读取用户状态及角色信息,根据不同角色返回不同的页面或同一页面中不同的内容。 在一些要求不太严格的ASP程序中,也有通过查询字符串或通过Cookie存储用户身份认证通过的,但这是及不安全的做法,在这两种处理方式中用户都有可能篡改验证数据,伪造已通过认证的假象。 2 ASP.NET基于角色的安全管理 从ASP.NET2.0开始出现了基于角色的安全管理技术,并提供了7个用于身份识别的控件和一个网站管理工具。使于基于角色的安全管理技术,能及大地提高开发效率,提升网站安全级别。基于角色的安全管理技术主要包括以下两个方面的内容: (1)用户身份认证:主要包括新用户注册、用户登录、修改密码、显示状态和其它信息等。这些操作基本上都可以通过工具箱“登录”选项卡中的7个控件来完成。 (2)用户权限管理:主要包括为用户分配角色和为角色分配可访问的资源等。 使用基于角色的安全管理技术,重点在于开发人员在规划创建ASP.NET站点时,需要根据资源的级别不同使用树形目录的方式进行组织。需要在根站点下设置若干子目录,将安全等级不同的文件存放在不同的子目录中,然后为每个子目录添加一个w eb.config文件,利用该文件配置本目录的安全规则。 在vs2010中默认的方法是通过“ASP.NET网站管理工具”及登录控件配合来完成添加用户、添加角色、编辑访问规则等信息。同时系统会自动在App_Data目录下创建一个名为aspnetdb.mdf的数据库文件,此数据库是系统自动创建,专门用于存储用户、角色等信息,我们可以通过“ASP.NET网站管理工具”对其进行维护。 但是,系统默认创建的aspnetdb.mdf数据库为SQLEXPRES S版,存储在站点的App_Data目录,数据库连接名为Local Sql S erver,这给我们站点的发布及数据的迁移带来一些新问题,再者在一些复杂的应用环境中,必须通过编写程序来实现特定的网站安全管理。下文主要探讨如何通过Membership API编程的方式实现用户、角色的安全管理。 3 Membership API编程概述 Membership API是Membership类中公有方法的集合,使用Members API能够实现用户、角色的常规管理,如创建用户、删除用户、创建角色等。在vs2010中可以通过Login登录控件能实现的功能,通过Members API都能以编程的方式实现,而且更加灵活强大。想通过Membership API编程的方式实现用户、角色的常规管理,需要从以下几个方面理解: 3.1 命名空间的引用 Membership类包含于System.Web.Security命名空间,使用其方法前应使用using命令在应用程序中引用该命名空间,即 Using System.Web.Security; 3.2 将安全数据库(Asp Net.mdf)信息导入系统数据库 系统默认下安全数据库与系统数据库是分开的,为方便后续数据库的管理及迁移,应将安全数据库信息导入系统数据中。 为完成安全数据导入,需要运行Asp.net SQL Server注册工具(aspnetregsql.exe),并通过向导完成相应的导入操作。该工具为一个单独的工具程序,默认存放在C:WindowsMicrosoft.NE TFrameworkv4.0.30319中(注,VS版本不同,存放位置也不同),找到aspnet_regsql.exe文件并双击打开,启动ASP.NET SQL Ser ver安装向导,在欢迎对话框中直接单击“下一步”按钮,打开如下图1所示的“选择服务器的数据库”对话框,输入SQL Server服务的计算机名称或IP地址,填写对数据库有管理权限的用户名和密码,并在下拉列表中选择你的系统数据库名称(如本例假定为ABC),如下图1所示。 然后单击“下一步”按钮,在打开的确认对话框中核对前面输入和选择的项目后单击“下一步”按钮,在最后出现的完成对话框中单击“完成”按钮,结束安全信息数据库的导入操作。操作完成后,在数据库管理界面中可以看到如图2所示的相关安全数据表。 3.3 在web.config中配置Membership类 在web.config中的Membership类的相关配置尤为关键,在<connection Strings>节中添加数据库连接,具体如下: 通过以上几个步骤的配置,就完成了安全数据库与网站数据库合并,修改了vs2010默认安全连接,接下来通过编程的方式实现网站安全管理。 4 编程方式完成用户、角色相关操作的具体代码实现 4.1 编程方式添加用户的具体代码实现 在网站中添加一个Web窗体,在Web窗体中添加一个按钮,双击按钮进入窗体后台代码编辑界面,首先引入命名空间: 在窗体中设计如下图3所示创建用户界面,所用控件均为系统自带文本框控件,并按次序分别命名为Username、Password、Email、Questions、Answer。 在按钮的单击事件中添加如下代码: 运行窗体,然后在创建用户表单中输入相应的值,单击“创建用户”按钮,则该安全用户编程创建成功。 4.2 编程方式完成角色管理的代码实现 角色管理是指创建、删除、查询、分配角色的操作。这些操作可以通过Roles类中提供的一系列方法来完成。所有操作均基于引用了System.Web.Security命名空间,且必须建立在完成了第3节所有配置的基础之上。 (1)创建新角色 创建一个新角色可以使用Roles类的Create Role()方法来实现,其语法格式为: Roles.Create Role(Role Name); 其中,Role Name参数表示希望创建的新角色名称。例: Roles.Create Role(”admin”); 则创建了一个名为admin的角色。 (2)为用户分配角色 为数据库中现有用户分配角色可以使用Roles类的Add User To Role()方法来实现,例: Roles.Add User To Role(“郭某某”,”admin”); 意为将用户郭某某添加到admin角色中。 依此做法,都将能以编程的方式完成用户、角色的添加、删除、查询、更新等一系列操作,限于篇幅,此处再不赘述。 5 网站访问管理规则的创建 所谓“网站访问规则”是指为网站中不同的文件夹分配可以访问的用户或角色。为网站创建访问规则可以有两种方法: 5.1 用“asp.net网站管理工具”创建 可以借助“asp.net网站管理工具”可视化界面操作完成对每个文件夹的安全配置,如图4所示。 注意,此时在“asp.net网站管理工具”中所做的所有操作,都将保存在系统数据库即我们指定的数据库中。 每个目录的访问规则可以由若干条组成,但执行的顺序为自上而下,当某一条目被匹配后后续的条目不再处理,所以设置规则时条目的排列十分重要。 5.2 直接手动配置每个目录的web.config文件 Web.config是一个XML文件,我们随时都可以通过记事本编辑此文件,完成对网站目录的安全配置。例,手动配置网站dmin目录下的web.config文件,配置内容如下: 理解了上述语法含义,程序员就可以轻松的使用记录事本编辑web.config文件,达到修改或创建网站访问规则的目的。 6 结语 本文所探讨内容在win7+vs2010下均测试通过。 总之,实现网站安全管理的手段有很多,但通过Members API以编程的方式实现,将使网站安全管理更加灵活、强大,同时在数据迁移及网站发布方面将带来意想不到的便利。 参考文献 关键词:专家系统,逻辑推理,ASP.NET,Prolog 0 引 言 专家系统 (ES) 是人工智能应用研究最活跃和最广泛的领域之一, 它应用人工智能技术和计算机技术来解决那些需要人类专家处理的复杂问题。在智能应用的开发中, 为了提高效率、性能、质量和缩短开发周期, 其开发工具的选用就显得非常重要, 在ES的发展过程中, 已经形成了多种专用智能语言, 如Lisp、 Prolog、 Clips等等, 它们的优点在逻辑推理方面显现出强大功能, 但其本身提供的功能已不能满足设计完善的人机交互界面的需要, 同时单独使用其编制的软件运行速度慢, 知识库维护困难, 因此同时采用其他高级编程语言来共同进行ES开发。本文采用Prolog与ASP.NET联合开发ES, 用Prolog语言构建知识库, 实现推理过程, 而用ASP.NET实现人机界面, 发挥各自的优势。 1 Prolog语言简介 Prolog可以用几乎接近自然语言的方式描述现实世界的各种关系, 近年来Prolog语言出现多种版本, 如早期的Turbo Prolog、Amzi! Prolog、Visual Prolog、Swi Prolog等, 它们都各有特点。其中Amzi! Prolog版本集成了开发环境IDE、解释器、编译器和运行器, 可以在其中编写、调试、运行、编译程序[1]。它也提供命令行的形式进行运行编译, 但更为突出的特点是提供了Amzi!逻辑服务器 (amzi! Prolog logic server) 或Prolog引擎, 它是用来连接其他应用程序的动态链接库。由于Amzi! Prolog提供了与别的软件连接的接口, 其他的程序可以调用它的强大功能, 因此, 我们选择Amzi! Prolog版本, 使其程序能与ASP.NET程序方便地连接。 2 混合ES的实现原理 利用面向对象开发工具语言与人工智能技术相结合, 此结合源于专家系统要求有较好的人机界面及较为灵活的推理机制, 也是面向对象语言对智能的需求。具体表现为:采用ASP.NET (C#) 作为开发平台集中管理数据库、维护知识库、控制推理机的推理、编写人机接口等强大功能;主要利用Prolog语言所具有的强大的逻辑推理功能, 以及对不确定问题所具有的模糊处理能力的特点, 实现系统智能操控。 根据Amzi! Prolog的特点, 本文采用Amzi!的最新版Amzi! Prolog7.6.9, 它运行在Eclipse 3.3.1 IDE中。Amzi! Prolog语言中的Amzi!逻辑服务器是一个面向对象语言的实现, 每一个逻辑服务器就是一个对象, 而这个对象的方法就是逻辑服务器的API函数[2]。因此, 对于一个面向对象语言 (比如 .NET) , 提供给逻辑服务器一个面向对象接口是自然的。Amzi!逻辑服务器这一面向对象的概念可以用两个动态链接库文件:Amzi.dll、Amzinet.dll来实现, 实际上, Amzi.dll动态链接库就是Amzi!逻辑服务器[3];而Amzinet.dll是实现Logic Server API功能的接口库, 在amzinet.dll中可以实现amiz! .NET类, 而.NET类封装了LogicServer类、LSException类和它们的方法, 它是实现ASP.NET与Amzi! Prolog结合的一个非常重要的动态链接库。其关系如图1所示。 3 ASP.NET (C#) 与Prolog的接口实现 下面主要以ASP.NET与Prolog为例进行论述, 利用Amzi!.NET类提供的接口函数来实现连接。在正式调用Amzi! Prolog程序之前, 必须把Amzi!动态库和.NET库文件添加到主调用环境中:Amzi!逻辑服务器amzi.dll和Amzi!.NET接口amzinet.dll。即在Visual Studio 2005环境中, 将Amzi!Prolog7.6.9的bin文件夹下的amzinet.dll文件引用到项目中, 把amzi.dll复制到应用程序文件所在的目录下。由图1可知, 在Windows环境中, 其ASP.NET (C#) 调用Prolog程序的具体步骤如下: (1) 编写、编译、连接Amzi! Prolog源程序。在Amzi! Eclipse IDE中, 要建立一个项目, 并在这个项目中再建立一个prolog源程序, 然后编译、连接形成运行文件*.xpl, 但要注意在导航栏中会出现两个.xpl文件, 一个是项目名.xpl, 一个是源程序名.xpl。 (2) 在Visual Studio 2005中, 新建一个网站。把项目名.xpl文件复制到网站文件所在的目录下, 也可以把源文件复制到此目录下。 (3) 在Visual Studio环境中, 重新生成项目解决方案, 并完成界面开发。在实现与Prolog语言的混合编程时, 需要一些接口函数:ISInit (“ ”) 方法表示初始化逻辑服务器, 在使用逻辑服务器之前, 必须对它初始化, 也就是它必须用在所有函数之前。ISLoad (string xplname) 方法表示加载Prolog语言的可执行文件 (.xpl) 到逻辑服务器中, 由于有两个.xpl文件, 所以特别注意, 这里加载的还是项目名.xpl文件, 最好把文件所在路径写出来。ISExecStr (string str) 方法是用字符串方式写出询问命令传到逻辑服务器中, 并获得.xpl的结果参数。其实也可以使用ISCallstr () 方法, 它与ISExecStr () 方法是一样的。ISGetStrArg (TERM term, int iarg) 方法含有两个参数, 第一个参数是其推理结果, 第二个参数表示取Prolog询问命令中的第几个参数的值。最后用到的一个方法是ISClose () , 它是关闭逻辑服务器[4]。 (4) 在IIS中运行即可。 下面用一个简单的例子来说明实现方法。编写Prolog程序为rull1.pro, 其含有一个规则谓词rull1, 在界面设计中使用Button按扭事件处理调用这个规则谓词, 然后用谓词rull1/2来寻找与Y相匹配的Z, 输出结果放在Textbox控件中。 具体实现连接的关键程序语句如下所示: 程序输出如下:“起吊重量超过额定吊量>100, 禁止启吊!”。 4 应用实例 本课题是针对基于Web的起重机训练和考核专家系统的研究。在用Amzi! Prolog与.NET混合编程建立系统时, 首先要知道各自要完成的任务。一般来说, 运用ASP.NET实现系统的设计, 即网页界面的实现, 主要包括下面几个方面:作为开发平台集中管理数据库, 实现算法, 人机接口的设计等功能;而利用逻辑程序设计语言Prolog实现强大推理功能, 即把推理机的核心部分分给其来处理。这样, 就会设计出基于Web构架的专家系统的网络结构。在这个系统中, 最核心的技术就是两种语言的连接, 利用.NET作为前台去调用Prolog, 让两者都发挥出各自的优势, 同时也以极少的程序量提高了程序开发效率。具体连接程序如上所述。ASP.NET网页开发代码界面如图2所示, 其为解决方案资源管理器。可以看到加载的动态链接库amzinet.dll, 在Amzi! Eclipse IDE中生成的项目可执行文件yuping.xpl, 这两个文件是程序运行成功与否的关键所在。图3是在IIS中运行WebSite3网站后的网页内容, 单击Button按钮, 在其右边的TextBox控件中显示出调用Prolog程序的结果。 5 结 论 ASP.NET是目前功能强大的网站开发工具, 而Prolog在结果实现过程的逻辑推理方面和结果最终实现的智能化方面是其它技术所不可比拟的[5]。通过研究二者开发专家系统方面的优缺点, 以ASP.NET (C#) 语言与Amzi! Prolog语言为例, 论述了其混合编程的原理, 并给出了两者连接的关键技术。由此可见, 这种结合方式不仅切实可行, 而且快捷高速。在互联网飞速发展的时代, 开发出基于Web的专家系统, 是必然的发展方向。 参考文献 [1]赖朝安, 孙延明, 郑时雄.结合C++与Prolog语言快速开发专家系统[J].计算机工程与应用, 2002, 38 (3) :30-32. [2]Amzi!Inc.Amzi!Logic Server User’s Guide&Reference[EB].help—Amzi!Prolog+Logic Server IDE. [3]Deraldo Messner da Silva.C#.NET Genealogy Web Application[EB/OL].http://www.Amzi.com. [4]Thomas Steiner.An Introduction to Intelligent Services[EB/OL].ht-tp://www.Amzi.com/.ASP编程 第3篇
ASP编程 第4篇
ASP编程 第5篇
ASP编程 第6篇
ASP编程范文
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


