说明:由于行文仓促及作者水平有限,难免有错,欢迎来信指正。
一般的大型网站目前已经越来越少的使用ASP来架构,不过在中小型商务站点上,ASP依然占据了较大的市场范围。ASP以其简单,开发周期短,易维护的优点受到中小型站点管理员的青睐。不过,据我所知,完全使用ASP来集成更新维护网站的仅常见于那些真正的商务站点或者比较成熟的技术站点,更多的网站仅仅有一些独立的栏目在使用ASP程序。这样的特点是站点管理过于分散,比如:每进入一个栏目管理都要输入不同的帐号和密码。不仅浪费管理员的精力,更加重了网站的维护困难程度。而我们看见的那些单栏目使用的ASP程序有很多是从网上寻找的源代码,这样使你的网站安全性也会受到一定的威胁,因为网上提供的源代码都是开放的,每个人都可以研究这个代码,当然后果你也知道,ASP的安全性本来就是一个受用户长期关注的问题,而被开放的源代码更是危险。当然我并不是不赞成大家使用网上的源代码,只是希望各位能够注意这个问题,不要完全信奉拿来主义,该修改的地方还是要修改,该打补丁的地方还是要打上补丁(当然绝不是让你去修改人家的版权信息)。
综上所述,我觉得凡是对ASP有一定了解的人都可以自己开发一套整站系统,并且使集成化的。本专题的目的就是为了指引大家如何建立一套完整的web动态站点。
为了使各个层次的读者都能看懂本文,有必要先讲讲下面这些话:
如果你是初学者,你应该掌握什么?
必要的VBscript和Javascript。vbs作为主要的ASP程序编写语言来自于Visual Basic,学过VB的人可以很快的掌握,Javascript就不用说了,嵌入在网页里面,客户端使用平凡的脚本语言。你最好拥有一定的HTML语言知识,不然会觉得很恼火。
SQL语句基础亦是基础!
初期你不必掌握全部,基本的就可以了。
前提:我们将用最基本的语句和功能编写一套web动态站点的整站系统。
您只要认真看完此专题,可以基本掌握web整站开发的思想,并已能赋予实际应用。当然,随学习的深入,您可以加入更多的功能或对程序算法进行改进。
(1)对网站进行需求分析:
很多人都忽略了这一点,他们认为开发web站点程序不需要用软件工程的思想,实际上最后会导致web站点的无序化,比如:一些人想到要开发什么站点想都不想,直接开始写代码,想到什么就写什么,直到他们写完之后,才发现我还需要什么功能没有写,然后就立刻返回加代码。这样的话,使得程序极易出错。所以一开始的时候还是建议你像软件工程一样,制定web站点开发的需求分析,应包括所开发web系统的基本要求,如:功能,性能,用户群,基本的数据流程和处理流程,安全与保密的要求。web系统的目标,条件、假设、限制等。
详细一点来说,就以我们的站点来说,它是一个技术型站点,就应包括新闻系统、文章系统、下载系统等等,那么这些系统需要具备哪些功能就是我们要分析的问题。
下面我们就从实例来分析要实现的功能:
新闻系统:一个新闻系统最重要的一点就是能够实时的把新闻传达给用户,那么新闻系统应该具备哪些功能?发布时间,点击次数,插入图片,以及对新闻来源赫作者的一些注释。当然发布时间这些都是非常容易实现的功能。插入图片可以使用html功能,ubb转换表或上传图片来解决,这些方法本文就不再一一阐述,大家可以参考有关资料。
实际上,不管对于什么系统,当你在一开始对其需求进行了详细分析之后,实现起来肯定比想到哪写道哪轻松高效。如果方便的话用电脑或者纸将web系统的开发需求记录下来,在开发过程中也可以进行参考。这里还不得不提的一个话题是关于用户验证的,一般我们对用户的验证使用的是session和cookie,Session变量和cookies是同一类型的。如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量及cookies。一般来说,对于网站管理员的操作我个人推荐使用session,因为我们的主题是开发web整站,那么管理员肯定要在多个管理页面中跳转,在这里session是非常方便的。若是对用户进行验证,那么可以使用cookies,比如用户可以设置强制浏览器把cookie存储在计算机上面,只需要使用response.cookies的Expires属性就可以轻松的做到,还有一点就是因为sessionID的信息是非常容易丢失的,对于用户这种长时间访问的集群,则必须通过在用户的web浏览器中存储一个专用的cookie,并且把cookie信息保存到数据库中来创建一个用户标识。
上面这一节我们讲到了web整站开发的先期需求分析,就我个人认为是在网站工程中非常重要的一步。
(2)组织和管理站点结构
往往在开发一个有一定规模的站点的时候,使站点具有较好的目录结构是一个值得注意的问题。商业应用的程序往往都要求具有在事务内部运行脚本和组件的能力。事务是服务器端的操作,简单的说就是即便该操作包含了许多步骤,例如:下定单,查看定单,打印订单等也只能整体返回操作是成功还是失败。用户可以创建在事务内部运行的ASP脚本,如果教本的任何一部分操作失败,那么整个事务就终止。
这里我们要详细说明的并不是事务性脚本在整站中的应用,而是要让你在开发中不至于被众多的文件,众多的操作搅昏了头。
合理的对文件名进行组织。例如:我们将管理页面命名为admin.asp,而管理页面中对各个栏目进行操作的页面可以在admin后面加下划线然后命以这个栏目的名称,比如新闻管理页面admin_news.asp,下载管理页面admin_download.asp
关于文件的放置。我这里仅是以我得做法来讲解,相信各位能有自己的见解。将所有管理操作页面放置于同一目录下面,为的是更加方便的管理和分配权限。各个栏目用户页面可以放在一个目录下方便于管理。数据库可以放在统一的目录下面。
怎样减少文件的数量。你没有必要为每个添加,删除,修改或者别的操作新建许多页面,你可以使用参数来减少页面,打一个比方,在管理页面admin_news.asp中,当admin_news.asp?action=addnew的时候执行添加操作,当admin_news.asp?action=del的时候执行删除操作,这样将大大增强你站点集成化程度。
可以重用的代码。很多代码是可以重复使用的,比如UBB的转换表等,可以把它们单独放在一个目录中。
(3)开发后台管理
我不知道各位开发者是不是和我一样,先将后台开发完毕后再进行前台开发。或者你是混在一起来做。不过,我认为先开发后台是比较合适的。前面我们讲过先要对系统进行分析,要实现哪些功能自己心里要有个底。这样做起来才会事半功倍,也会减少许多不必要的错误。后台管理无非具有以下这些功能:
1)用户验证
2)添加网站数据
3)修改网站数据
4)删除网站数据
5)站点系统设置
6)站点访问统计
7)搜集用户信息
...
如何把他们同意的集中在一起管理,是我们要解决的问题。比如说用户验证我们可以这样来实现:
<%
...
username=replace(trim(request("username")),"","")
password=replace(trim(Request("password")),"","")
set rs=server.createobject("adodb.recordset")
sql="select * from admin where password="&password&" and username="&username&""
rs.open sql,conn,1,1
if not(rs.bof and rs.eof) then
if password=rs("password") then
session("admin")=rs("username")
session("flag")=rs("flag")
else
end if
else
end if
...
%>
username和password是从用户表单输入传递过来的值,你一定要注意用replace处理一次后再和数据库中存储的值进行对比。因为我们知道username=username是恒等的,必须把用户输入的去掉。
通过验证后建立一个session变量,可以很方便的在各个管理页面中进行管理。
要对用户进行验证的页面可以这样写:
<%if session("admin")="" then
response.write "no access"
else
...
end if
%>
有人在数据处理的页面会遗忘写这个验证,这是非常危险的,用户可以通过这个缺陷非法提交数据。
再来说说如何收集用户信息,这似乎都不涉及到太多技术了,一般可以这么做,比如你站点的特色是提供自主产权的软件下载,你可以让用户在下载前填写用户信息表,这个方法在外国网站用的比较多,在中国还很少见,我的网站就拥有这个功能,让我轻松的知道来自美国和新西兰的用户比较多。
在进行后台管理开发的时候还往往遇到这个问题,为不同的管理员分配不同的权限。仅以西路整站系统讲一种方法。在上面验证用户的时候我们还将flag写入了session变量,我们可以通过flag来判断用户级别,当然前提是你已经为flag分配了不同的值。具体可以这样实现:
<%
select case session("flag")
case "1"
case "9"
case "10"
case else
%>
<script language="javascript">
if (confirm("您的操作权限不够(进入站点新闻设置界面需要第1或9,10级权限),系统拒绝你的访问,请点确定返回,或者点取消退出重新登录"))
location.href="admin.asp";
else
location.href="quit.asp";
</script>
<%end select%>
以上确定了三种级别可以进入该操作页面的管理员。当然这里仅仅是说明了一种简单的验证方法,其实你亦可以使用split函数等来确定用户权限。