参考文献

<script language=javascript src=script/scroll.js></script>
文章索引 :
  • <script language="JavaScript">
    </script>

  • 1、PHP 5.0 + IIS 6.0 的安装配置
    1. 将 php5ts.dll 和 libmysql.dll 拷贝到目录 c:/windows/system32/
    2. 将 php.ini 拷贝到目录 c:/windows/
    3. 将libmysql.dll拷贝到目录 c:/windows/system32/
    4. 修改 php.ini 文件:
      • 第385行 register_globals = On
      • 第422行 default_charset = "GB2312"
      • 第443行 doc_root = "d:/java"
      • 第450行 extension_dir = "D:/php5/ext"
      • 第461行 cgi.force_redirect = 0
      • 第578行 extension=php_mysql.dll
      • 第665行 mysql.default_port = 3306
      • 第672行 mysql.default_host = localhost
      • 第675行 mysql.default_user = sa
      • 第859行 session.save_path = "N;/tmp"
    5. 在IIS服务器管理中,添加一项扩展名为 PHP 的扩展服务,并将可执行程序指向 D:/PHP5/php5isapi.dll,启动
    6. 在IIS服务管理、属性、主目录、配置中添加一个后缀为.php 的程序,指向 D:/PHP/php5isapi.dll - 所有动作
    7. 重启 IIS 6.0 and 开始享受 PHP 吧

    返回 Top

    2、MySQL + PHP 5.0 的安装调试
    1. 安装完PHP5和MySQL之后,数据库连接上了,这时候想试验一下一些自己的数据或者自己建立一张表,用PHP读一下生成一些简单的页面,这就需要MySQL的管理工具,这里推荐最具权威的PHPMyAdmin2.5.7,真正安全和可视化的所见即所得界面,建立一个数据库变得极为简单;
    2. 我们下载到PhPMyAdmin,解压并把它放到IIS虚拟目录里面,目录名改为Admin。在IE里面输入http:/index.php进入MySQL管理界面,只可以看到数据库test并且是空的,我们动手自己创建一个表,随便创建一两简单的表做试验;
    3. 解压phpmyadmin2.5.7,把文件夹名称改为phpadmin,打开config.inc.php,修改80、81、83行:
      $cfg['Servers'][$i]['user'] = 'root';
      $cfg['Servers'][$i]['password'] = '';
      $cfg['Servers'][$i]['only_db'] = '';
    4. 检查 config.inc.php 中的主机、用户名和密码,并且确定这些信息与MySQL 服务器的管理员所给出的信息一致。
    5. 进windows里找my.ini,修改最下面2行:
      user=root
      password=
    6. MYSQL安装成功后,进入MYSQL/bin目录双击winmysqladmin进入命令行,输入命令mysql -h localhost -u root -p回车,提示输入密码,输入MySQL的初始密码mysql,回车,显示成功登录的欢迎信息。
    7. 接着更改用户root的密码为空:
      输入set password for root@"localhost"=password(''); root用户密码更改成功。
    8. 在网络属性中将Microsoft网络客户端删除,重启计算机,重新安装Microsoft网络客户端。
    9. 重启系统,OK.

    返回 Top

    3、GHOST2003启动盘-使用说明
    ★  "GHOST2003英文原版"的使用方法:
    
        "GHOST2003英文原版"适用于高级用户,但常用功能所有用户都应熟练掌握.
        因篇幅有限,只举一个最常见的例子,其余的大家可以举一反三: 
    
        例:如何用GHOST备份和恢复C盘?
    
        1,备份"C盘":
    
        当你的C盘新装(重装)系统后,都要用GHOST备份一下,以防不测:
        (1)启动GHOST:用本软盘启动电脑,出现主菜单后,选择"1.Ghost"菜单,回车,进入
    GHOST界面.
        (2)选择基本动作:单击Local→Partition→To Image (这步一定不要选错)
        (3)选择源分区:这里因为是备份C盘,所以在弹出窗口中单击第一行,单击"OK"确定.
        (4)选择目标分区:这里可以选D盘,E盘...等(任意一个有足够空间的分区均可),
    我们选D盘,即在弹出窗口中单击第二行.
        (5)输入文件名:在弹出的窗口中的上方选择一个文件夹(不选也可,即保存的根
    目录里,自己定吧),下方输入备份文件的名称(带有GHO的后缀名),如"C.GHO",单击
    "SAVE"(存储).
        (6)选择压缩比例:有三个可选项,No表示不压缩,速度最快;Fast表示压缩比例小,
    速度较快(推荐);High表示压缩比例最高,速度最慢.
        (7)开始备份:在弹出的窗口中选择第一个按钮就OK了.下面的就是等待了.整个
    备份过程一般需要十几分钟(时间长短与C盘数据多少,硬件速度等因素有关),进度条
    到100%时,会再弹出一个窗口,单击按钮就OK了.
    
        2,恢复"C盘":
    
        当你的C盘出现严重软件问题时,用以前备份过的GHO文件进行恢复:
        (1)启动GHOST:用本软盘启动电脑,出现主菜单后,选择"1.Ghost"菜单,回车,
    进入GHOST界面.
        (2)选择基本动作:单击Local→Partition→From Image (这步一定不要选错)
        (3)选择源分区:这里因为是备份到D盘,所以在弹出窗口中单击第二行,单击"OK"确定.
        (4)选择文件名:在弹出的窗口中的上方选择"C.GHO",单击"LOAD"(调出).
        (5)选择目标分区:当然是C盘了,即在弹出窗口中单击第一行.
        (6)开始恢复:在弹出的窗口中选择第一个按钮就OK了.下面的就是等待了.整个
    恢复过程一般需要十几分钟(时间长短与GHO文件大小,硬件速度等因素有关),进度条到
    100%时,会再弹出一个窗口,选择第二个按钮(重新启动电脑)就OK了.
    
    
    ★ "GHOST2003中文向导"的使用方法:
    
        "GHOST2003中文向导"适于初级用户,只要按提示一步一步操作即可,具体方法:略.
        注意:本版"中文向导"暂不支持NTFS等特殊格式的分区.
        
    
    ★ GHOST参数详解:
    
        本盘"中文向导"主要依据"MAFA3光盘11月版"中的DOS批处理编写,本站长作了必要的
    修改和优化,其中的"GHOST参数"是批处理的灵魂,以下从网上摘录的文章有助于大家理解
    和修正本盘的GHOST_CN.BAT:
    
        (一)常用参数:
    
        -rb  本次Ghost操作结束退出时自动重启。这样,在复制系统时就可以放心离开了。 
        -fx  本次Ghost操作结束退出时自动回到DOS提示符。 
        -sure  对所有要求确认的提示或警告一律回答“Yes”,和-CLONE选项一起使用来
    避免提问。此参数有一定危险性,只建议高级用户使用。 
        -fro  如果源分区发现坏簇,则略过提示强制拷贝。此参数可用于试着挽救硬盘
    坏道中的数据。 
        @filename  在filename中指定txt文件。txt文件中为Ghost的附加参数,这样做
    可以不受DOS命令行150个字符的限制。 
        -f32将源FAT16分区拷贝后转换成FAT32(前提是目标分区不小于2G)。WinNT4和
    Windows95、97用户慎用。 
        -bootcd  当直接向光盘中备份文件时,此选项可以使光盘变成可引导。此过程
    需要放入启动盘。 
        -fatlimit  将NT的FAT16分区限制在2G。此参数在复制Windows NT分区,且不想
    使用64k/簇的FAT16时非常有用。 
        -span  分卷参数。当空间不足时提示复制到另一个分区的另一个备份包。 
        -auto  分卷拷贝时不提示就自动赋予一个文件名继续执行。 
        -crcignore  忽略备份包中的CRC ERROR。除非需要抢救备份包中的数据,否则不
    要使用此参数,以防数据错误。 
        -ia  全部映像。Ghost会对硬盘上所有的分区逐个进行备份。 
        -ial  全部映像,类似于-ia参数,对Linux分区逐个进行备份,对其它分区则用
    正常方法。 
        -id  全部映像。类似于-ia参数,但包含分区的引导信息。 
        -quiet  操作过程中禁止状态更新和用户干预。 
        -script  自动按照脚本文件中的命令来运行程序,可以执行多个Ghost命令行,
    命令行存放在指定的文件中。 
        -span  启用映像文件的分卷功能。 
        -split=x  将备份包划分成多个分卷,每个分卷的大小为x兆。这个功能非常
    实用,用于大型备份包复制到移动式存储设备上,例如将一个1.9G的备份包复制到
    3张刻录盘上。 
        -z  将磁盘或分区上的内容保存到映像文件时进行压缩。-z或-z1为低压缩率
    (快速);-z2为高压缩率(中速);-z3至-z9压缩率依次增大(速度依次减慢)。 
        -clone 这是实现Ghost无人备份/恢复的核心参数。
        使用语法为:
        -clone,MODE=(operation),SRC=(source),DST=(destination),[SZE(size),
    SZE(size)......] 
        此参数行较为复杂,且各参数之间不能含有空格。 
        其中operation意为操作类型,值可取:copy:磁盘到磁盘;load:文件到磁盘;
    dump:磁盘到文件;pcopy:分区到分区;pload:文件到分区;pdump:分区到文件。
    Source意为操作源,值可取:驱动器号,从1开始;或者为文件名,需要写绝对路径。
    Destination意为目标位置,值可取:驱动器号,从1开始;或者为文件名,需要写
    绝对路径;@CDx,刻录机,x表示刻录机的驱动器号,从1开始。 
    
        下面举例说明:
        命令行参数:ghostpe.exe-clone,mode=copy,src=1,dst=2 
        完成操作:将本地磁盘1复制到本地磁盘2。 
    
        命令行参数:ghostpe.exe-clone,mode=pcopy,src=1:2,dst=2:1 
        完成操作:将本地磁盘1上的第二分区复制到本地磁盘2的第一分区。 
    
        命令行参数:ghostpe.exe-clone,mode=load,src=g:/3prtdisk.gho,dst=1,
    sze1=450M,sze2=1599M,sze3=2047M 
        完成操作:从映像文件装载磁盘1,并将第一个分区的大小调整为450MB,
    第二个调整为1599MB,第三个调整为2047MB。 
    
        命令行参数:ghostpe.exe-clone,mode=pdump,src2:1:4:6,dst=d:/prt246.gho 
        完成操作:创建仅具有选定分区的映像文件。从磁盘2上选择分区1、4、6。
    了解了这些参数后,我们就可以轻松地实现Ghost的无人备份/复制/恢复了。
    冲杯咖啡吧。 
    
        注意事项 
        1.在备份系统时,单个的备份文件最好不要超过2GB。 
        2.在备份系统前,最好将一些无用的文件(如win386.swp)删除以减少Ghost文件的
    体积。通常无用的文件有:Windows的临时文件夹、IE临时文件夹、Windows的内存
    交换文件。这些文件通常要占去100多兆硬盘空间。 
        3.在备份系统前,整理目标盘和源盘,以加快备份速度。 
        4.在备份系统前及恢复系统前,最好检查一下目标盘和源盘,纠正磁盘错误。 
        5.在恢复系统时,最好先检查一下要恢复的目标盘是否有重要的文件还未转移,
    千万不要等硬盘信息被覆盖后才后悔莫及啊。 
        6.在选择压缩率时,建议不要选择最高压缩率,因为最高压缩率非常耗时,而
    压缩率又没有明显的提高。 
        7.在新安装了软件和硬件后,最好重新制作映像文件,否则很可能在恢复后出现
    一些莫名其妙的错误。 
    
        (二)不常用参数:
    
        -IR:和ID一样,但不将分区调整为扇区界限。 
        -IB:只复制磁盘的启动扇区。 
        -OR:覆盖空间并进行完整性检查。 
        -NOLILO:复制后不要试图去修正LILO启动调入器。 
        -FDSZ:清除目标磁盘上的标志性字节。 
        -FDSP:保留目标磁盘上的标志性字节。(优先级高于-FSSZ) 
        -LPM:LPT主并行连接模式。 
        -LPS:LPT从并行连接模式。 
        -TCPM:TCP/IP主连接模式。 
        -TCPS:TCP/IP从连接模式。 
        -USBM:自动进入USB主模式。 
        -USBS:自动进入USB从模式。 
        -JL:记录多点传送会话诊断消息到文件。 
        -JS:设置最大的多点传送值。 
        -JA:设置多点传送会话的名称。 
        -CHKIMG:检查映象文件的完整性。 
        -PWD:指定密码。 
        -SKIP:指定需要跳过的FAT文件系统中的文件或目录。 
        -PMBR:当进行任何磁盘复制操作时,保留目标磁盘中的主引导记录。 
        -F64:当调入旧映象文件时允许64K的簇大小。 
        -FATLIMIT:防止FAT分区大小超过2兆。 
        -NTD:允许NTFS内部诊断检查。 
        -NTC-:禁止NTFS连续簇分配。 
        -NTCHKDSK:强制CHKDSK在下一个NTFS卷启动。 
        -NTIC:忽略NTFS卷上的CHKDSK位。 
        -NTIL:忽略非空的NTFS日志文件检查位。 
        -NTIID:忽略分区系统标识符的复制。 
        -TAPEBUFFERED:默认的磁带模式。 
        -TAPESAFE:当使用旧的或不可靠的磁带时有用。 
        -TAPESPEED:允许控置磁带速度。 
        -TAPEUNBUFFERED:强制非缓冲的磁带输入输出。 
        -TAPEEJECT:强制磁带操作完后弹出。 
        -TAPEBSIZE:磁带块大小。 
        -NOFILE:禁止文件询问。 
        -DL:指定存在的硬盘号。 
        -FIS:使用检测出的硬盘最大值。 
        -FNX:禁止扩展13号中断支持。 
        -FFX:使用扩展13号中断。 
        -FNI:禁止直接IDE硬盘存取支持。 
        -FFI:使用直接IDE硬盘存取。 
        -FNS:禁止直接ASPI/SCSI硬盘存取支持。 
        -FFS:使用直接ASPI/SCSI硬盘存取。 
        -NOSCSI:禁止使用ASPI存取SCSI设备。 
        -BFC:处理坏的FAT簇。 
        -VDM:写入前使用使用磁盘校验命令来检查磁盘上的每个扇区。 
        -CRC32:使用CRC32校验。 
        -FCR:当建立文件时创建校验文件。 
        -AFILE:使用指定的中止记录文件。 
        -DI:显示诊断。 
        -MEMCHECK:诊断内存。 
        -DD:记录磁盘信息到GHSTSTAT.TXT 
        -DFILE:使用指定的信息日志文件。 
        -FINGER:显示详细的指纹信息。 
        -VER:显示程序版本号。
    
        声明:由于以上参数所依据的版本可能是GHOST7.0或更早的版本,有些参数可能已经过时;
    又由于本盘采用的是GHOST2003是个人版,所以有些参数(如部分与网络相关的参数)无法使用.
    
    
        总之一句话,请大家多提意见和建议,以有利用本盘的不断改进。
    
    DOS之家 葛明阳(gmy)制作
    http://doshome.com
    gmy@0451.com
    QQ:53617565

    返回 Top

    4、PHPLIB 的安装
    1. 下载phplib最新包,并解压好。
    2. 将phplib目录的内容放到一个安全的地方,例如/php5下
    3. 将这个目录的路径名添加到php.ini的include关键字段后
      修改php.ini文件的第436行,include_path = "d:/php5/phplib/php"
    4. 然后修改第413行,将auto_prepend_file关键字改成:
      auto_prepend_file = prepend.php
    5. 重新启动一次web服务器,用phpinfo()函数检查包含路径和自动预加载参数,如果显示的值和刚才设定的一样的话就证明成功了。

    返回 Top

    5、session概述

    一、session概述

    session是什么,刚开始我也不明白,非专业词典翻译为会议,会议期。作个不太恰当的比喻吧(虽然不恰当,但意义却是一样的),,session是你和网站之间的感情。
    session在WEB技术中占有非常重要的份量。由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须
    通过session记录用户的有关信息,以供用户再次以此身份对web服务器提供要求时作确认,例如,我们在某些网站中常常要求用户登录,
    但我们怎么知道用户已经登录了呢,如果没有session的话,登录信息是无法保留的,那岂不要让用户在每一页网页中都要提供
    用户名和密码。
    当然,session不光用于用户身份认证功能,还可能用于其它方面,以后我们会提到的。
    session用中文来解释就是会话期。一个会话期开始于用户输入一个站点的网址时,结束于他离开这个站点时。
    session最早出现在动态脚本语言Active Server Pages中,它的功能之强大,是一句话无法说清楚的。
    当php还在3.0版本时,session是它永远的痛。虽然php具有执行速度快,使用灵活,功能强大等优点,但因为session的问题,使
    很多站点的开发放弃了php,至少我的老板是这样认为的。当时有很多php免费函数库提供在php3上实现session的方案,但都让人感觉不正宗。
    就好象你花好几千大洋买的手机却配置一个很粗糙的草作的袋子一样,虽然功能是一样的,但总让人觉得别扭。php4的出现让php在session问题上
    有了翻身的机会。虽然它的session实现还不是很理想(主要是效率问题),但毕竟是它自己实现的,而且可以实际使用了。
    那我们用session干什么呢,你说了半天,我用不上的话,你岂不有卖纸张之嫌。OK,我们来看看session有什么用:作过网站的人都有
    这样的体会,在一页页面中的变量(在本章都指服务器端变量,下同)是不能在下一页中用的,虽然有一些办法可以实现,比如用form,urlstring等等
    但有些对于用户来说是不方便的,即使让form自动提交,但其中的延时在现今的网络状况下足以让人窒息,而这两种方法都明显加大程序员的负担。如果你
    正在开发一个大型项目,那这些额外的负担是不能忽略的。而有了session就好办了,session中注册的变量可以作为全局变量使用。什么,全局变量?
    好极了。这样一来,你知道有什么用了吧:最主要的用于用户身份认证,程序状态记录,页面之间参数传递。
    说了它这么半天的好处,你已经动心了吧,先别高兴,它还有缺点呢:它是用文件保存的变量(当然效率不高了,虽然可以用别的方式,但
    很麻烦的),不能保存对象。与之相对的是,asp中的session可以保存对象变量,用内存变量来保存session变量。但为什么我们还选用php呢,呵呵,
    为什么,你能从本书的开始看到这章,想必你也应该明白了吧,你还不明白,Faint,你再从头看起吧,我保证你成为PHP专家^_^。
    session是怎样实现的呢?呵呵,你一定以为很高深吧,我来告诉你它的秘密。如果说只保存变量的话,很多读者都明白,这是很简单的,
    但前面我们说过,http协议是一种无状态的连接,你怎么知道那个变量是谁的,这个变量又是谁的呢?在session实现中用cookie实现的。cookie
    存在于客户端,也就是用户的机器中,里面保存着用户的session ID,也就是session号码,当用户的浏览器请求服务器时把session ID也一起送到
    服务器,这样服务器就可以识别你是谁,也就可以把变量识别开了。这样我们就不难理解了,为什么有时session会失效了。不信的话,你可以试试:
    在IE的"工具"菜单上有"Internet选项"菜单,打开后再选"安全"->"自定义级别",将安全设置中的"允许使用每个对话cookies"设为禁用,再看看
    session能不能用。这下明白了吧!不过php4在linux/unix平台上可以自动检查cookies状态,当cookies 不可用时,自动会把session ID
    附带在url上进行传递。这是它在session方面比asp多的唯一的优点了。

    二、php3,4中session的实现

    在php3中是没有session这种东东的,但我们又需要,怎么办呢?别急,有很多人替你做了这些,这其中最有名的要算phplib了。你可以去国外下
    载,也可以上国内大部分php站点下载。我们要做的第一件事是让phplib和php3结合在一起使它能工作。为了能实现这方面的功能,我们需要先安装phplib。
    跟着我来做,很容易的(以下方法在win2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21 for win32 上通过)
    phplib最基本的功能包括用户认证,Session管理,权限及数据库的抽象化。
    怎样使用phplib来实现session功能呢?
    一、首先你将phplib解开,里面有一个目录叫"php",将这个目录拷贝到apache的安装目录下。以下以笔者的机器为例:
    我的apache安装在d:apache 目录下,我将上面的"php"目录拷贝到d:apache,并将phplib下的pages目录下的文件和目录一起拷贝到
    d:apachehtdocs下,注意不带目录本身。
    phplib的类库需要根据系统进行初始化,你可以修改local.inc文件,其中包含着一些基本参数,你可以根据自己机器的实际情况来进行修改。
    将d:apachephpprepend.php3文件中的一段程序改为如下样子:

    if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
    $_PHPLIB["libdir"] = "d:/apache/php/"; //这儿改为你放phplib下php目录的路径
    }

    然后将d:apachephplocal.inc文件改如下:

    class DB_Example extends DB_Sql {
    var $Host = "localhost";//你的mysql数据库所在主机名
    var $Database = "test";//数据库名
    var $User = "root";//数据库用户名
    var $Password = "";//数据库用户口令
    }

    最后一步执行解开的phplib目录中的stuff目录下的create_database.mysql文件,生成初始表。

    返回 Top

    6、给初学PHP的5个入手程序

    加入日期:2003年05月31日 03:47:12 AM 作者:Kinter 论坛转载
    php的基本语法格式与C类似,没学过C的朋友花几分钟看看别人的源代码怎么写的,就基本熟悉格式了。

    ----------------------------------------------------
    下面进入正题
    准备了5个程序:
    1.使用一个基本的函数,其结果是字符串形式,用echo显示出来
    2.显示一个漂亮的表格
    3.一个表单例子,提交并显示提交结果
    4.数据库操纵例子(投票程序)
    5.动态创建图形并保存例子

    ----------------------------------------------------

    #程序1:

    /* 功能:显示PHP极其APACHE的配置环境和各种参数变量*/

    <?php

    echo phpinfo();/* php有丰富的函数库,大量便捷的函数极大的提高你的工作效率。phpinfo()就是其中一个函数*/

    ?>

    ----------------------------------------------------

    #程序2:

    /* 功能:显示一个漂亮的表格

    <HTML>
    <HEAD>
    <TITLE>一个漂亮的表格</TITLE>
    </HEAD>
    <BODY>
    <?
    function useColor()
    {
    /*
    ** 请牢记我们最后使用过的颜色标记
    */
    static $ColorValue;
    /* 选择下一个颜色 */
    if($ColorValue == "#00FF00")
    {
    $ColorValue = "#CCFFCC";
    }
    else
    {
    $ColorValue = "#00FF00";
    }

    return($ColorValue);
    }

    print "<TABLE WIDTH="100%"> ";
    for($count=0; $count > 6; $count++)
    {
    /*
    ** 取得当前行的颜色
    */
    $RowColor = useColor();
    /*
    ** 把背景颜色用HTML语言
    ** 输出到表格单元
    */
    print "<TR><TD BGCOLOR='$RowColor'>";
    print "<FONT SIZE=2><CENTER>行数 $count</CENTER></FONT></TD></TR> ";
    }
    print "</TABLE> ";
    ?>
    </body>
    </html>

    ----------------------------------------------------
    #例子3

    <?
    if($send)
    {
    echo "发送结果:$send";
    exit;
    }

    ?>

    <html>
    <title></title>
    <body>
    <form action=<?echo $PHP_SELF?> method=post>
    <input type=text name=send value="输入值">
    <input type=submit>
    <input type=reset>
    </form>
    </body>
    </html>

    ----------------------------------------------------
    #例子4 :投票程序
    在这里:http://www.21php.com/forums/showthread.php?s=&threadid=524

    #例子5: 动态创建并保存图形

    <?//必须有GD库支持
    Header("Content-type:image/jpeg");
    $im=imagecreate(400,30);
    $black=ImageColorAllocate($im,0,0,0);
    $white=ImageColorAllocate($im,255,255,255);
    ImageTTFText($im,20,0,10,20,$white,"c:windowsfontsRaavi.ttf","i am kinter");
    ImageJpeg($im,"hello.jpeg");
    ImageDestroy($im);
    ?>

    返回 Top

    7、用php创建简单的和多页的表单

    用php做一个简单的表单

    PHP最有用的特性之一是它能够自动将表单中的变量值赋予PHP变量。这使得表单处理变得非常快捷。

    因此,如果你送出一个内含输入栏位值的表单如下:

    <INPUT TYPE=TEXT NAME="name" VALUE="Glen Morris">

    当你用PHP处理此页面,$name变量的值就会是 Glen Morris。

    因此,你可以用如下的方式把值打印出来:

    echo "Hi $name!";

    或者像这样测试其值:

    if ($name == "Glen Morris") { echo "Please check your email."; }

    这有一个用PHP处理基本表单的很好方法。例如,我们需要做一个简单的问卷调查,要求填写者必须填写他们的姓名,电子邮件地址,并回答一些我们感兴趣的问题。

    首先,我们会将页面拆成两个函数。因此,我们只需要写一个 PHP页面并用程序逻辑去控制对用户的显示内容就可以了,而不是写两个单独的网页(一个针对表单部分,另外一个针对处理表单的CGI脚本)。

    显示表单

    第一个函数用来显示表单:

    <?php

    functiondisplay_form() {

      global $PHP_SELF;

    ?>

    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>

    Name:   <INPUT TYPE=TEXT NAME="name"><BR>

    Favorite Cheese: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie

                     <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar

                     <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

    Favorite Times to Eat Cheese:

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">Noon

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">Dinner

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Late night

    <INPUT TYPE=HIDDEN NAME="stage" VALUE="results">

    <INPUT TYPE=SUBMIT VALUE="Thanks!">

    </FORM>

    <?php

    }

    ?>

    以上文字大部分都只是产生表单所需的HTML代码,然而,我们必须对一些复杂的地方加以说明的。

    首先是变量$PHP_SELF。$PHP_SELF是一个很方便的参考变量——其值就是当前页面的 URL。因为要让该网页处理此表单,我们把这个表单的TARGET设为$PHP_SELF。通过使用$PHP_SELF变量而非该页面实际的实际路径,我们可以对此脚本任意重命名或移动位置,而不必担心每次重用此段代码时,都要重新详细定位页面。

    顺带提一下,以下这一行

    global $PHP_SELF;

    表明我们要获取全局变量$PHP_SELF。不同于函数,变量在其声明范围具有局部生存期,即可以与在函数外声明的同名函数有不同的值。如果我们没有明确告之PHP我们需要的是全局变量$PHP_SELF,我们就会发现,$PHP_SELF为空。

    再者,可以注意到我们甚至在函数内部出入PHP模式。这是完全合法的语法。PHP 能智能化地自动忽略其中所有的HTML代码,只寻找下一段PHP代码的起始位置。这甚至比起一直处于PHP模式中用echo输出HTML码还要快。

    来看单选按钮及勾选框中的 NAME 属性,你会注意到times[]在变量名后面跟著一对括弧,而cheese后却没有。这是因为单选按钮只让你选择一个正确的答案,因此cheese的值只会有一个字符串。相反,勾选框可以让你选择多个答案。PHP要存放这些答案必须将其放到一个数组中。在times变量名后面加上[],就可以让PHP知道它是一个数组而非标量。

    最后,我们还有一个隐藏变量stage。我们用$stage来判断是否要显示表单还是要计算处理结果。

    表单处理

    接下来是处理表单的函数,process_form()。

    <?php

    functionprocess_form() {

      global $name;

      global $cheese;

      global $times;

      if ($cheese == 'brie') { $cheese_message = 'I love brie.'; }

      elseif ($cheese == 'cheddar') { $cheese_message = 'Cheddar is awesome!'; }

      else { $cheese_message = 'Fresh mozzarella is divine.'; }

      $favorite_times = count($times);

      if ($favorite_times <= 1) {

        $times_message = 'You should eat cheese more often.';

      } elseif ($favorite_times > 1 && $favorite_times < 4) {

      $times_message = 'Those are good times to eat cheese.';

      } else {

        $times_message = 'You are eating too much cheese.';

      }

     

     

      echo "Hello $name.";

      echo "$cheese_message $times_message";

    }

    ?>

    首先,如同我们处理$PHP_SELF一样,我们获取表单里面的全局变量。然后检查cheese选项中哪一个被选中以按选择创建回应。

    下面,我们使用count()函数,以计算被选为喜好时段的时段数。在过去,必须通过检查$cheese每一个可能的值来实现,而现在我们只要利用大于、小于来比较$favorite_times的大小就可以了。如果你希望知道“$favorite_times > 1 && $favorite_times <

    4”
    中“&&”的含义,它表示“and”。因此,$favorite_times必须大于一而且小于四,此条件才能成立。

    在代码最后,我们输出用户名以及我们提供给他的信息。当然,你也可以实现各种各样有趣的变化,例如,将信息存在数据库中,或通过查询数据库中信息并以适当格式返回结果。

    组合表单

    现在我们已得到此二函数,接着只需要再放入一小段代码,就可以把二者连接一起,并建立代码所需的逻辑关系。在display_form() 以及process_form() 下加入以下代码:

     

    <?php

    if (empty($stage)) { display_form(); }

    else { process_form(); }

     

    ?>

     

    首先,我们检查变量$stage是否为空。在 PHP中,一个变量如果未曾初始化(即未曾赋值)或其值为零(也就是被赋值为零,即空白字串或者是零值),则该变量被视为空值。当用户首次访问网页时,$stage变量值为空。因此我们希望显示表单;否则我们将处理表单内容。

     

    以上即如何使用PHP处理表单的过程。


    用php做一个多页的表单

    如果可以在一个页面上建立多个表单,为何不能建立跨多页面的表单呢? 

    不幸的是,用 HTTP从一页面传送数据到另一页面并不轻松。因为在 HTTP协议中没有内建机制以定义系列页面的概念。不过,仅需通过一些灵巧的技巧,以及PHP 某些有用的函数,我们就可以不用花太多力气而突破此限制。在此章节中,关键思想在于把上一页面获取的输入存到下一页面表单的隐含变量中。当我们在屏幕不同页面切换时,代码也在页面间传递信息,每一表单都含有上一个表单的数据。这个方法似乎有点笨拙,不过就目前情况而言是最为简便的方法——且无需使用数据库或cookies。

    意料之中的是我们将扩展对变量$state的使用以适应此特性。这正是为什么我们过去学习了关于此技巧的内容,而没有打算使用更为简单的方式处理单一页面中的多个表单。

    为了方便起见,我们将重复使用先前的表单范例。但这次我们将将其拆分为两个页面,而非把有关乳酪的重要问题跟用户名称放在同一页面之上。

    由此会得到三个函数而非两个。此外,对函数略微更名以反映其内容上的改变。display_form() 现已改名为display_name()。

    <?php

    function display_name() {

     global $PHP_SELF;

    ?>

    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>

    Name: <INPUT TYPE=TEXT NAME="name"><BR>

    <INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese">

    <INPUT TYPE=SUBMIT VALUE="Thanks!">

    </FORM>

    <?php

    }

    ?>

    与先前所介绍的函数相同,但我们先解决下一问题,并把下一stage的名称改为 cheese以更明确地告之用户下一步要做什么。

    接下来是display_cheese()。

    <?php

    function display_cheese() {

      global $PHP_SELF;

      global $name;

    ?>

    <FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>

    Favorite Cheese: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie

                     <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar

                     <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

    Favorite Times to Eat Cheese:                  <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">Noon

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">Dinner

                     <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Late night

    <INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>">

    <INPUT TYPE=HIDDEN NAME="stage" VALUE="results">

    <INPUT TYPE=SUBMIT VALUE="Thanks!">

    </FORM>

    <?php

    }

    ?>

    以上的代码看起来应该非常熟悉。除在输出隐藏的stage元素前先输出上一部分数据中的 $name变量名及值之外,我们没有做任何意料之外的修改。我们并未直接输出变量值,而是通过一个名为htmlspecialchars()的PHP函数。在HTM中,有以下四个字符除被作为标记(markup)使用外,在其他地方不应被使用的:“<”、“>”、“"”、以及“&”。因此,为了确保不使浏览器造成混乱,我们通过htmlspecialchars()函数使用$name变量。由此,某个人的名字原为"Bret & Jeff"就会成为"Brett & Jeff" 了。

    现在,当提交此新表单时,不会漏失任何信息。

    以上技巧的作用是我们不必更改原process_form() 函数任何部分。事实上,我们还会保持函数名称不变。仅需对页面显示逻辑加上新的一行。

    <?php

    if (empty($stage)) { display_name(); }

    elseif ($stage == 'cheese') { display_cheese(); }

    else { process_form(); }

    ?>

    看到了吗?我们只需在先前的两个声明中加入elseif。这正是使用变量$stage的巧妙之处。如果我们要再添加几个页面,只需写一个新函数以显示所要的内容,并当其显示时加入一行代码对其进行控制即可。


    本文作者:David Sklar是Student.Net Publishing的首席信息官。
    Adam Trachtenberg是Student.Net Publishing产品副主管。


    返回 Top

    8、上海复旦流媒体技术应用方案

    一、了解网上直播:

    以前,对于一些重要活动,例如足球世界杯,春节联欢晚会,演唱会,国家重要会议,等,主要通过电视进行直播。现在,随着流媒体技术的成熟,我们多了一个传播的媒介——互联网 / 内联网(Internet / Intranet)。传统的电视直播,只能覆盖某个特定地理区域;而网上的直播,可以不受地理限制,甚而可以覆盖全球。

    为什么要做网上直播呢?因为有些活动,是在8小时的工作时间进行,例如这次的足球世界杯比赛,这时候大家都在上班,不方便看电视;或者有的活动,覆盖到你那里的电视台没有做直播,例如中央电视台的春节联欢节目,国外的电视台不做直播的话,在海外的华人就很难看到。

    二、了解网上直播系统的结构:

    如何做网上直播呢?其实并不复杂。先来了解一下系统结构,网上直播系统是由节目源、编码机、流媒体服务器、播放终端,组成。

    节目源,即你要直播的视频内容来源,它可以是电视机接收的节目(如世界杯比赛)、摄象机正在拍摄的现场活动(如春节联欢晚会),也可以是DVD机播放的DVD(如各种大片)。

    编码机,即安装了流媒体采集卡和流媒体编码软件的计算机。流媒体采集卡建议选择Osprey;流媒体软件系统建议选择RealSystem,或者Windows Media 。

    流媒体服务器,即安装了流媒体软件系统的服务器端的硬件服务器。

    播放终端,即想要收看直播的且已经联网的计算机。当然,还要安装流媒体软件系统的播放器部分,例如RealSystem的RealPlayer或者Windows Media Player。

    三、安装调试:

    接下来进行安装调试。

    先将编码机和节目源连接好。设置好正确的视频制式后,测试一下是否可以正常采集。然后设置一下采集的窗口大小和直播的码流大小。这两个参数一起影响最终的收看效果。如果是在内联网上直播,网络带宽应该不是问题,所以窗口大小可以考虑设置在320*240到640*480之间,当然窗口越大图象越清晰,相应的,对编码机和播放终端机的配置要求也越高。压缩的码流可以设置在200Kbps到800Kbps之间。如果是在互联网上直播,就要考虑带宽的影响了。需要考虑的有2点:编码机和服务器之间的上传带宽,服务器的出口带宽。上传带宽要大于压缩的码流;服务器的出口带宽要大于压缩的码流乘上最大的并发访问数量。

    如果是在互联网上做直播,流媒体服务器很可能会托管在IDC机房,那么就要考虑出口带宽是否有保证,因为流媒体比普通网页需要更大的带宽。一个流媒体文件的访问所需要的网络带宽,大约是一个对网页访问所需要的网络带宽的几倍到几十倍。

    流媒体软件的服务器端的安装很简单,基本不需要做什么设置。如果是用的RealSystem,最好将服务器的IP地址和RealServer绑定,以免出现问题。

    先进行一下直播测试。运行流媒体编码软件,进行一些选择和填写必要的信息,其中主要的信息是流媒体服务器的IP地址、端口号、用户名、口令,等等。当编码软件开始上传后,在任意一台联网的计算机上打开流媒体播放器,输入直播地址,直播地址的格式如下:

    rtsp://192.168.0.1:554/encoder/test

    然后按回车键。RealPlayer缓冲几秒后,如果开始播放转播的电视节目,说明整个系统正常。

    直播地址说明:

    rtsp:流媒体传输的协议——“实时流协议”,不必改变;

    192.168.0.1:流媒体服务器的IP地址,将这个地址替换成你的流媒体服务器的实际的IP地址;

    554:端口号,不必改变;

    encoder:直播的路径,不必改变;

    test:直播时为直播节目设置的临时文件名,提换成你为直播取的临时文件名。

    如果压缩的码流比较大,那需要先将RealPlayer的属性里的两个连接速率设置成最大,否则不能正常接收。

    四、网上发布:

    测试正常后,将直播的地址连接到网页上。

    如果是在内部网里做直播,需要建立一个内部网站。首先,在你的流媒体服务器上舔加IIS,然后建立虚拟目录,制作一个网页,将直播地址连接上,将此网页保存为“index.htm”,保存在虚拟目录下。

    如果直播是面向Internet的,那就需要建立WEB服务器,制作网站。在网页上建立好连接后,就可以通过互联网向全球直播了。

    对于面向Internet的网上直播,如果观众太多(例如直播足球世界杯比赛),导致网络带宽和服务器负担不起,该如何解决呢?

    显然,租用足够的带宽、购买足够的服务器是不明智的,因为直播结束后,这些资源中的大部分就会闲置下来,造成太大的浪费;

    “组播”,是一个在内网上非常有效地节约带宽和服务器资源的方法。但是,在互联网上实施“组播”几乎不可能,因为互联网不是属于某个组织,所以不可能将直播覆盖的地区的所有的网络设备的组播功能都打开;

    现在,唯一可行的方式,是租用CDN(内容分发网络,“Contents Delivery Network”的缩写)服务。这个服务就象租用虚拟主机服务——因为是和大家共享服务器和出口带宽,所以成本很低。所谓CDN服务,举个例子说明:如果在北京做网上直播,当租用了在上海提供的CDN服务后,那么北京的流媒体服务器只要发一个视频流到上海的CDN设备,就可以覆盖所有上海的观众,上海的观众只要访问上海本地的CDN设备,就可以收看网上直播了,因为这些观众的访问请求不必都经过骨干网拥向服务器,从而节约了骨干网带宽和服务器资源,相应的降低了直播成本。

    五、疑难咨询:

    如果想了解流媒体采集卡的信息,可以参考如下网站:http://www.osprey.com.cn/ ;如果有问题要咨询,可以到“流媒体中国”网站的“硬件论坛”咨询:http://www.liumeiti.com/forum/board.asp?B=17

    返回 Top

    9、中宽用户管理系统(CBSMS)

    用户管理系统SMS(Subscriber Management System),主要针对数字付费电视用户及其相关信息进行管理,主要包括用户信息、用户设备信息、节目预定信息、用户授权信息、财务信息等进行处理、维护管理。
    功能介绍:
    1. 用户信息管理:实现用户的增加、撤销、信息修改等。
    2. 资源管理:主要功能是对IC卡、机顶盒等设备资源进行进销调存以及使用状态的管理。
    3. 产品化管理:对节目提供商所提供的节目进行产品化管理。

    4. 用户订单管理:用户订购产品的订单的增加、取消、确认、修改等。
    5. 用户业务支援:为保证用户业务正常运行而进行的管理功能。

    6. 计费管理:计费主要是计算应收取用户的费用
    7. 收费管理:系统在运行计费处理之后,通过收费点(银行代办点或广电营业厅)进行收费;以通过用户到收费点缴纳现金、支票或通过银行划拨的方式完成收费。
    8. 财务管理:包括对应收和实收的金额进行管理,对用户信用进行管理,对财务清算和账务报表的管理等。扩展的账务系统能够对各运营商以及节目提供商进行分账处理。
    9. 授权管理:根据用户的订单情况进行的预处理操作,主要包括对用户信用度的确认、用户业务与IC卡有效性的确认等。


    10. 系统管理:对系统的操作任务分组定义角色、对操作员进行授权以及定义系统运行的系统参数并进行维护。
    11. 报表管理:生成系统中的各种报表。按时间分类有年报、月报、日报。以及按业务分类的用户、产品等报表。
    功能特点:
    ★面向数字电视业务
    ★提供全面统一的用户授权与管理系统
    ★支持网上开户、网上查询、网上付费等远程业务
    ★提供对内容提供商以及其他合作对象的管理
    ★提供费用分摊、收益分成功能
    ★模块化设计,开发采用开放性通用平台,平滑升级性好
    ★系统具有可移植性和可升级性

    返回 Top

    10、win2000 公钥基础结构及应用

    1 概述
        Windwos 2000为电子商务提供了一个理想的平台, 其安全性(包括证书管理、 CA服务、 公用密钥基本体系), 保证了电子商务的开展。 结合Windows 2000的IIS 5.0服务, 可以快速创建一个网上电子商务的平台。

    Windows 2000中有两种验证协议, 即Kerberos和公钥基础结构(Public Key Infrastructure, PKI), 这两者的不同之处在于: Kerberos是对称密钥, 而PKI是非对称密钥。在Internet环境中, 需要使用非对称密钥加密。 即每个参与者都有一对密钥, 可以分别指定为公钥(PK)和私钥(SK), 一个密钥加密的消息只有另一个密钥才能解密, 而从一个密钥推断不出另一个密钥。 公钥可以用来加密和验证签名; 私钥可以用来解密和数字签名。 每个人都可以公开自己的公钥, 以供他人向自己传输信息时加密之用。 只有拥有私钥的本人才能解密, 保证了传输过程中的保密性。 关键是需要每个人保管好自己的私钥。同时, 为了保证信息的完整性, 还可以采用数字签名的方法。 接下来的问题是, 如何获得通讯对方的公钥并且相信此公钥是由某个身份确定的人拥有的, 这就要用到电子证书。 电子证书是由大家共同信任的第三方--认证中心(Certificate Authority, CA)颁发的, 证书包含某人的身份信息、 公钥和CA的数字签名。 任何一个信任CA的通讯一方, 都可以通过验证对方电子证书上的CA数字签名来建立起和对方的信任, 并且获得对方的公钥以备使用。

    Windows 2000的PKI是基于X.509协议的,X.509标准用于在大型计算机网络提供目录服务,X.509提供了一种用于认证X.509服务的PKI结构,两者都属于ISO和ITU提出的X系列国际标准,目前,有许多公司发展了基于X.509的产品,例如Visa、MasterCard 、Netscape,而且基于该标准的Internet和Intranet产品越来越多。X.509是目前唯一的已经实施的PKI系统。X.509 V3是目前的最新版本,在原有版本的基础上扩充了许多功能,目前电子商务的安全电子交易(SET)协议也采用基于X.509 V3。

    2 Windows 2000的公钥基础结构
    如何在数字化通信中建立起信任关系, 是电子商务发展的重中之重。 因此, 建立认证中心(CA)是关键的一步。 Windows 2000可以作为建立CA的技术方案, 其内置了一整套颁发证书和管理证书的基础功能。 Windows 2000 Server中有一个部件是证书服务器(Certificate Server), 是原来Windows NT 4.0的选项包中Certificate Server 1.0的升级产品。
    通过认证服务器, 企业可以为用户颁发各种电子证书, 比如用于网上购物的安全通道协议(SSL)使用的证书, 用于加密本地文件(EFS)的证书等等。 认证服务器还管理证书的失效, 发布失效证书列表等。 每个用户或计算机都有自己的一个证书管理器, 其中既放置着自己从CA申请获得的证书, 也有自己所信任的CA的根证书。

    Windows 2000中的电子证书都是基于X.509协议的, 保证了与其他系统的互操作性。 国际标准组织CCITT建议以X.509作为X.500目录检索的一个组成部分, 提供安全目录检索服务。 X.500是CCITT建议的, 用于分布网络中存储用户信息的数据库的目录检索服务的协议标准。 X.509是采用公钥基础结构实施的认证协议, 对通信双方按所用密码体制规定了几种认证识别方法, 它发表于1988年, 经多次修改, 1993年又公布了新的版本。 X.509对所用具体加密、 数字签名、 公用密钥以及Hash算法未作限制, 将会有广泛的应用,已纳入PEM(Privacy Enhanced Mail)系统中。

    就网上购物的过程来说, 目前常用的是SSL(安全通道协议)的方式, 即设置IIS就某些特定的文件或文件目录需要访问者提供客户端证书; 除非拥有电子证书及相应的私钥, 一个访问者的浏览器无法获得这些文件和文件目录。 SSL的方式体现在浏览器的访问栏上, 应该是Https而不是普通的Http。 通过网站验证后的访问者, 可以被映射为活动目录中的用户或者用户组, 实现合作伙伴之间外部网(Extranet)的应用。

    为了安全地保管私钥和电子证书, 在Windows 2000中, 微软为用户还提供了一套智能卡的结构。 智能卡因其高安全性和轻便的可移动性, 势必将发展成为类似鼠标/键盘一般的计算机的标准外设。 微软还提供了一套基于32位Windows平台的Smart Card for Windows产品, 包括API和开发工具。 众多的智能卡厂家, 如Gemplus, 只要生产符合国际ISO工业标准的智能卡产品, 就可以在微软的Smart Card软件平台上操作。

    当用户用Internet Explorer向一个认证中心申请电子证书时, 就会有一对公钥和私钥自动产生出来; 私钥可以存储在智能卡中, 公钥和其他身份信息(比如姓名、电子邮件地址等)发给认证中心。 如果认证中心批准该申请, 那么包含公钥的电子证书就会被返回来, 存储在智能卡中。 这种电子证书的申请过程也可以由管理员设定的批处理方法来进行, 用户还可以通过LDAP来查询CA中通讯对方的公钥, 因为Windows 2000的认证服务器是可以与活动目录相结合的, 所以这方面的查询很方便。

    智能卡存储私钥和电子证书的做法, 给最终用户提供了对自己安全信息的最大的控制, 可以方便地从一台机器携带到另一台机器使用; 可以在任何一个地点使用。 一般来说, 智能卡还会用一个个人密码(PIN)保护起来, 在要求高安全性的场合, PIN可以是一些生物信息, 比如指纹等。 智能卡中存储的信息是加密的, 即使破坏了智能卡也得不到里面的内容。 智能卡的阅读器也越来越普遍, 有USB型的, 也有PC卡型的, 甚至Windows终端上也会有智能卡插槽。 智能卡正在逐渐走向大众化。

    如果企业实施了基于Windows 2000的智能卡体制, 由企业保安机构给每个员工颁发一个智能卡。 员工就可以用这个卡完成很多的工作, 比如打开公司的大门, 打开自己的抽屉, 登录到计算机和网络; 加密自己的邮件和文件, 这样即使管理员有完全控制的权限, 管理员也不能获知其中的内容; 员工还可以上网购物, 比如购买一张机票, 然后直接到飞机舱前划卡即可上飞机; 还可以作为电话卡、 信用卡使用; 作为市政交费卡使用, 支付水、电、煤气等费用; 作为电子钱包式的储值卡来使用, 支付小额的午餐费、 出租车费等等。 可以说智能卡的应用在Windows 2000推出之后, 会有一个长足的进步。

    "公用密钥基本体系"通常简称为PKI(Public Key Infrastructure), 是一个数字认证、 证书授权和其他注册授权系统。 使用公用密钥密码检验及检证电子商务中所涉及的每个机构的有效性。 公用密钥基本体系的标准仍处于发展阶段, 尽管它们作为电子商务的一个必要组成部分已得到广泛使用。 图1是Windows 2000 的公钥基础结构, 其核心是加密服务、 证书管理服务, 为应用程序的开发提供了加密API接口(CryptoAPI)。 Windows 2000 的公钥基础结构具有以下特点:

    (1) 牢靠的安全性。 Windows 2000的公钥基础结构包括采用智能卡的牢靠验证, 保持公用网的保密性, 以及确保传输数据的完整性。 此外, 管理员可使用 Windows 2000 安全权限指派用户证书的使用。 
    (2) 简易管理。 Windows 2000的公用密钥与活动目录和组策略的集成, 可以对管理企业内部的委托关系进行调整, 还提供将证书直接或经 Internet Information Services 映射到活动目录中用户帐户的能力。 
    (3) 新机遇。 可以安全地交换诸如Internet等公用网上的文件和数据, 具有实现安全 E_mail(S/MIME)的能力。此外, 作为电子商务的一个重要组成部分, 可以利用电子签名建立发送者的无法否认机制。 

    图1 Windows 2000 的公钥基础结构

    3 Windows 2000 公钥基础结构的证书服务
    证书基本上是一个由权威发布的电子声明, 其作用在于担保证书持有者的身份。 证书将公用密码与持有相应私有密钥的个人、 机器或服务的身份绑定在一起。 证书由各种公用密钥安全服务和应用程序提供, 为非安全网(如 Internet )提供数据验证、 数据完整性和安全通讯。 
    Windows 2000 基于证书的过程所使用的标准证书格式是 X.509 V3, X.509证书包括有关证书拥有的个人或实体的信息及证书颁发机构的可选信息。 实体信息包括实体名称、 公用密钥、 公用密钥运算法和可选的唯一主体 ID。 版本 3 证书的标准制定了以下规定: 密钥标识符、 密钥用法、 证书策略、 替换名称和属性、 证书路径约束以及对证书撤消原因和列表分区。 
    Windows 2000 Server 证书服务是 Windows 2000 中的组件, 证书服务用于创建和管理证书颁发机构(CA)。 证书颁发机构负责建立和担保证书持有者的身份。 证书颁发机构还会在证书失效时, 将其撤消并发布证书撤消列表, 供证书检验机构使用。 最简单的公用密钥基本体系只有一个证书颁发机构。 事实上, 大多数配置公用密钥基本体系的组织使用多个证书颁发机构, 并将其有组织地形成证书分层结构。
    Windows 2000的证书服务按证书颁发机构类型分为:
    (1)企业根CA,是企业中最受信任的证书颁发机构,应该在网络上的其它证书颁发机构之前安装,需要 Active Directory.
    (2) 企业从属CA,是标准证书颁发机构可以给企业中的任何用户或机器颁发证书,必须从企业中的另一个证书颁发机构获取证书颁发机构证书,需要 Active Directory.
    (3) 独立根CA,是证书颁发机构体系中最受信任的证书颁发机构,不需要 Active Directory.
    (4)独立从属CA,是标准的证书颁发机构可以给任何用户或机器颁发证书;必须从另一个证书颁发机构获取证书颁发机构证书,不需要 Active Directory。

    证书服务的一个单独组件是证书颁发机构的Web注册页。 这些网页是在安装证书颁发机构时默认安装的, 它允许证书请求者使用Web浏览器提出证书请求。 此外, 证书颁发机构网页可以安装在未安装证书颁发机构的 Windows 2000 服务器上, 在这种情况下, 网页用于向不希望直接访问证书颁发机构的用户服务。 如果选择为组织创建定制网页访问 CA, 则 Windows 2000 提供的网页可作为示例。 
    4 智能卡
    智能卡是防止篡改的简便方法,它可以向诸如客户身份验证、登录到 Windows 2000 域、代码签名和保护电子邮件之类的任务提供安全性解决方案。通过智能卡登录到网络提供了很强的身份验证方式,因为,在验证进入域的用户时,这种方式使用了基于加密的身份验证和所有权证据。例如,如果某个不怀好意的人得到了用户的密码,就可以用该密码在网络上冒称用户的身份。很多人都选择容易记忆的密码,这会使密码先天脆弱,易受攻击。
    在使用智能卡的情况下,那个不怀好意的人将必须获得用户的智能卡和个人识别码 (PIN) 才能假扮用户。因为需要有另一层信息才能假扮用户,所以该组合明显不易遭受攻击。另一个优点是,连续发生几次不成功的 PIN 输入后,智能卡会被锁定,使得对智能卡进行词典攻击非常困难。(注意 PIN 不必是一列数字,它也可以使用其他字母数字字符。)
    对加密智能卡的支持是 Microsoft 集成到 Windows 2000 中的公钥基础结构 (PKI) 的关键功能。智能卡提供以下功能:
    (1)保护私钥和其他形式个人信息的防篡改存储区。
    (2)将安全性关键计算隔绝起来包含从不必"必须知道"的其它组织部门进行的身份验证、数字签名和密钥交换。
    (3) 在单位、家庭或路上的不同计算机之间发凭据及其他私人信息的可携带性

    返回 Top

    11、PHP4.2以后版本中使用表格数据

    正如文章标题一样,将会有越来越多关于PHP4.2以后版本出版和register_globals的讨论。

    如果你的PHP程序以前工作正常,但是升级到PHP4.2以后出错的话,请仔细阅读以下内容:

    以前,在你的PHP中,可能有一个像下面表格:
    <form action="page.php" method="post">
    <input type="text" name="variable" />
    <input type="submit">
    </form>
    而且,你可以像下面一样简单的访问你的变量:
    <?php
        echo $variable;
    ?>

    当升级到PHP4.2版本的时候出问题了--在安装的时候,PHP默认设置了register_globals=off,这个register_globals是php.ini中设置是否允许直接使用变量上面例子中$variable的参数,直到PHP4.2以前的版本,register_globals都是默认为on,也就说可以直接输出变量。然而,在PHP4.2以后的版本中,为了防止潜在的不安全代码的溢出,PHP开发组已经将register_globals默认为off。
     
    这就意味着以上的代码不再有输出。
    [译者注:通过一系列PHP函数的处理,也可以在register_globals=off的时候直接访问变量。]

    实际上,使用以上表格的时候,我们可以通过几种方式访问输入的值。

    因为我们使用了POST方式来提交数据,我们可以使用_POST数组,例如:
    <?php
        echo $_POST['variable'];
    ?>

    或者,如果以上的表格通过GET方式提交,我们可以使用_GET数组:

    <?php
        echo $_GET['variable'];
    ?>
     
    如果你出于某种因素不知道你使用了POST还是GET方式提交数据,你可以全部使用_REQUEST数组,例如:

    <?php
        echo $_REQUEST['variable'];
    ?>

    cookies和会话(sessions)相应的数组变量名称是_COOKIE和_SESSION,可以通过相同的方法来访问变量的值。还有_SERVER, _FILES, _ENV和GLOBALS数组,这些都是PHP的全局变量,可以用于PHP的任何地方,包括用在函数和类中。

    以下代码也可以正常工作:

    <?php
    function printPost ()
    {
        foreach ( $_POST as $key => $value )
        echo "$_POST[$key] => $value<br> ";
    }
    ?>

    你不需要在函数中使用语句'global $_POST;',就可以直接使用这个全局变量了。

    更多的内容,请参考PHP在线手册:
    http://www.php.net/manual/en/language.variables.predefined.php

    返回 Top

    12、分离美工 杜绝重复
      如果你正在设计一个交互式网站,你一定会关注两个主要的问题,就是美工和程序。这也是一个网站在建设中抛开其内容之后最关键的要素。通常有两种方式来协调美工和程序之间的关系:

      1.先做好美工页面,然后由程序员直接在美工页面的HTML文件中嵌入ASP、JSP、PHP等程序代码。

      2.美工和程序同时进行,但这时因为没有页面框架,程序只能做出一些关键代码,双方完成后再进行一次美工页面和程序代码的嵌入合成。

      在实际的网站建设过程中,由于人员、进度等环境的限制,大家通常会混合地使用上面两种协调方式。然而这两种方法都有不足之处:

      1. 效率不高。两者协调不好可能产生等待、重复代码调试步骤等现象;

      2. 调试不畅。由于程序代码最终需要嵌入在HTML页面中,代码的嵌入、调试、纠错都比较繁琐;

      3. 维护不便。一旦美工设计需要修改,如网站改版,那么所有程序和HTML代码混合页面都需要重写;

      如果你正在使用PHP程序建设网站,那么恭喜你,PHP的模板技术会比较圆满地解决上述问题。

      那么什么是PHP的模板技术?PHP模板即PHPlib的Template技术,是PHPLIB程序库中的一个主要模块之一,发展自Perl的Template。而PHPLIB则是在PHP上的一个扩展,提供了很多类库,能够方便地实现一些基本功能如用户认证,数据库封装等。我们可以在phplib.netuse.de上下载到其最新版本。要使用PHP模板,只需在PHPLIB的程序包中解开template.inc文件,并放到我们的PHP程序能够调用的目录里。

      剥开神秘的面纱,模板技术的核心概念简单得令人心跳:要将你的美工页面指定为模板文件,只需将页面中活动的内容如数据库输出,用户交互等部分定义成形式为{variable}的变量放在模板文件中相应的位置,当用户浏览时,由PHP程序文件打开该模板文件,将模板文件中定义的变量进行替换,当然,替换成对应的数据库输出或者用户交互等动态生成内容,举例如下:

    定义模板文件:Mytemplate.html

    Mytemplte.html的内容为:

      <html>
      .....
      <body>
      ...
      ...
      </body>
      </html>

      我们可以看到,事实上模板文件就是一个普通的HTML文件,它包含了你所想要的版面、美工等要素,而内部的活动内容则以变量的形式存在,并等待被替换。显然,模板文件直接被浏览是毫无意义的,因为它不包含任何PHP程序,所有的内容都是“死”的,现在我们来看看,怎样来调用模板,让它“活动”起来。

      假设我们在test.php文件中使用了上述模板,当用户浏览test.php文件时,test.php文件处理过程如下:

      test.php

      <?php
      $mydate=date("Y年m月d日"); //处理好变量的值
      include("template.inc"); //调入将模板程序模块
      $mytemp = new Template("/你的模板文件所在目录/");
      //创建一个模板实例mytemp,如果模板就在当前目录,那么使用"."就可以
      $mytemp->set_file("MyFileHandle","MyTemplate.html");
      //设置MyFileHandle文件句柄指向我们所要调用的模板文件Mytemplate.html
      $mytemp->set_var("today", mydate);
      //调用模板的set_var方法,设置模板中的变量today值为$mydate
      $mytemp->parse("MyOutput","MyFileHandle");
      //调用模板的parse方法,对MyFileHandle文件句柄所指向的模板文件进行分析,替换其中相应变量
      //并把替换结果即完整的HTML文件内容保存在字串变量MyOutput中
      $mytemp->p("MyOutput");
      // 打印输出结果字串变量MyOutput的值
      ?>

      就是这么简单,模板技术很轻松地把网站设计分离成了清晰的美工和程序两个方面,并把他们的成果简单方便地结合了起来。如美工设计需要修改,那么我们只要记住原模板中各个变量名,把他们插入到新模板中对应位置就可以了。真的很轻松!另一方面,在PHP程序中基本没有了PHP脚本和HTML语法混合的现象,很大地提高了PHP系统的执行效率,而且如果是数据库等一些费时的操作,现在可以很及时地关闭数据库,释放资源,这样也在一定程度上提高了PHP和相关系统的资源使用效率。

      好了,关于PHP模板技术的基本概念就介绍到这里,下次我们再介绍更高层的模板应用!

    返回 Top

    13、模板技术在PHP中的应用
      什么是PHP的模板技术?PHP模板发展自Perl的Template。剥开神秘的面纱,模板技术的核心概念简单得令人心跳:要将你的美工页面指定为模板文件,只需将页面中活动的内容如数据库输出,用户交互等部分定义成形式为的变量放在模板文件中相应的位置,当用户浏览时,由PHP程序文件打开该模板文件,将模板文件中定义的变量进行替换,当然,替换成对应的数据库输出或者用户交互等动态生成内容。

        模板能够改善网站的结构,其特点有:

    • 可以在几秒钟改变你的整个站点的外观;
    • 抽象程序设计,没有垃圾HTML代码;
    • 设计人员不需要关心全部的"模糊"代码;
    • 令人惊讶地快;
    • 更容易重用旧的模版(对普通的表单而说)

        现在在PHP中应用最多的模板有两种,Phplibtemplate和Fasttemplate,这两种模板作者虽然不同,但是在语法结构和函数定义上却有着惊人的相似之处。只要你掌握了其中的一个,另一个相信你也会很快的熟练运用。本专题总括了使用模板的优点和优势,又分别介绍了Phplibtemplate和Fasttemplate的使用方法和技巧,最后又对这两种模板的效率进行了对比。希望通过这个专题,能帮助那些想了解模板技术的朋友用最快的速度去掌握它,并在以后的编程中去应用这项伟大的技术。 🙂

    返回 Top

    14、用PHP制作静态网站的模板框架

      模板能够改善网站的结构。本文阐述如何通过PHP 4的一个新功能和模板类,在由大量静态HTML页面构成的网站中巧妙地运用模板控制页面布局。

    提纲:

    ===================================

    分离功能和布局

    避免页面元素重复

    静态网站的模板框架

    ===================================

    分离功能和布局

       首先我们来看看应用模板的两个主要目的:

    • 分离功能(PHP)和布局(HTML)
    • 避免页面元素重复

       第一个目的是谈论得最多的目的,它设想的情形是:一组程序员编写用于生成页面内容的PHP脚本,同时另一组设计人员设计HTML和图形以控制页面的最终外观。分离功能和布局的基本思想就是使得这两组人能够各自编写和使用独立的一组文件:程序员只需关心那些只包含PHP代码的文件,无需关心页面的外观;而页面设计人员可以用自己最熟悉的可视化编辑器设计页面布局,无需担心破坏任何嵌入到页面的PHP代码。

       如果你曾经看过几个关于PHP模板的教程,那么你应该已经明白模板的工作机制。考虑一个简单的页面局部:页面的上方是页头,左边是导航条,其余部分是内容区域。这种网站可以拥有如下模板文件:

    <!-- main.htm -->
    <html>
    <head><title>模板示例</title></head>
    <body>
    <table><tr><td>{HEADER}</td></tr>
    <tr><td>{LEFTNAV}</td><td>{CONTENT}</td></tr>
    </table>
    </body></html>

    <!-- header.htm -->
    <img src=/"sitelogo.jpg/">

    <!-- leftnav.htm -->
    <br><a href=/"foo/">Foo</a>
    <br><a href=/"bar/">Bar</a>

       可以看出页面如何由这些模板构造而成:main模板控制着整个页面的布局;header模板和leftnav模板控制着页面的公共元素。花括号“{}”里面的标识符是内容占位符。使用模板最主要的好处在于界面设计者能够按照自己的意愿编辑这些文件,比如设置字体、修改颜色和图形,或者完全地改变页面的布局。界面设计者可以用任何普通HTML编辑器或者可视化工具编辑这些页面,因为这些文件都只包含HTML代码,没有任何PHP代码。

      PHP代码全部保存到单独的文件中,这个文件也就是由页面URL实际调用的文件。Web服务器通过PHP引擎解析该文件,然后把结果返回给浏览器。一般地,PHP代码总是动态地生成页面内容,比如查询数据库或者执行某种计算等。下面是一个例子:

    <?php

    // example.php
    require(/'class.FastTemplate.php/');
    $tpl = new FastTemplate(/'./');
    $tpl->define( array( /'main/' => /'main.htm/',
    /'header/' => /'header.htm/',
    /'leftnav/' => /'leftnav.htm/' ) );

    // 此处的PHP代码设置$content使其包含合适的页面内容

    $tpl->assign(/'CONTENT/', $content);
    $tpl->parse(/'HEADER/', /'header/');
    $tpl->parse(/'LEFTNAV/', /'leftnav/');
    $tpl->parse(/'MAIN/', /'main/');
    $tpl->FastPrint(/'MAIN/');

    ?>

       这里我们使用的是流行的FastTemplate模板类,但其基本思路对于其他许多模板类来说都一样。首先你实例化一个类,告诉它到哪里去寻找模板文件以及哪一个模板文件与页面的哪部分对应;接下来是生成页面内容,把结果赋予内容的标识符;然后,依次解析各个模板文件,模板类将执行必要的替换操作;最后把解析结果输出到浏览器。

       这个文件完全由PHP代码构成,不包含任何HTML代码,这是它最大的优点。现在,PHP程序员可以集中精力编写生成页面内容的代码,而不必为了如何生成HTML去正确地格式化最终页面而担心。

       你可以使用这种方法和上面的文件构造出一个完整的网站。如果PHP代码是以URL中的查询字符串为基础生成页面内容,例如http://www.foo.com/example.php?article=099,你可以据此构造出一个完整的杂志网站。

       很容易看出采用模板还有第二个好处。如上例所示,页面左边的导航条单独保存为一个文件,我们只需编辑这一个模板文件就可以改变网站所有页面左边的导航条。

    避免页面元素重复

       “这确实不错”,你也许会想,“我的网站主要就是由大量的静态页面构成。现在我可以从所有页面中删除它们的公共部分,要更新这些公共部分实在太麻烦了。以后我就可以用模板制作出很容易维护的统一页面布局。”但事情并非这么简单,“大量的静态页面”道出了问题的所在。

       请考虑上面的例子。这个例子实际上只有一个example.php页面,它之所以能够生成整个网站的所有页面,是因为它利用了URL中的查询字符串从数据库之类的信息源动态地构造出页面。

       我们之中的大多数人所运行的网站并不一定都有数据库支持。我们的网站大多数由静态页面构成,然后用PHP在这里、那里加上一些动态功能,比如搜索引擎、反馈表单等。那么,如何在这种网站上应用模板呢?

       最简单的方法是为每一个页面复制一份PHP文件,然后在每一个页面中把PHP代码里代表内容的变量设置成合适的页面内容。例如,假设有三个页面,它们分别是主页(home)、关于(about)和产品(product),我们可以用三个文件分别生成它们。这三个文件的内容都类如:

    <?php

    // home.php
    require(/'class.FastTemplate.php/');
    $tpl = new FastTemplate(/'./');
    $tpl->define( array( /'main/' => /'main.htm/',
    /'header/' => /'header.htm/',
    /'leftnav/' => /'leftnav.htm/' ) );

    $content = /"<p>欢迎访问</p>
    <img src=//"demo.jpg//">
    <p>希望你能够喜欢本网站</p>/";
    $tpl->assign(/'CONTENT/', $content);
    $tpl->parse(/'HEADER/', /'header/');
    $tpl->parse(/'LEFTNAV/', /'leftnav/');
    $tpl->parse(/'MAIN/', /'main/');
    $tpl->FastPrint(/'MAIN/');

    ?>

       显然,这种方法有三个问题:我们必须为每一个页面复制这些复杂的、牵涉到模板的PHP代码,这与重复公共页面元素一样使得页面难以维护;现在文件又混合了HTML和PHP代码;为内容变量赋值将变得非常困难,因为我们必须处理好大量的特殊字符。

       解决这个问题的关键就在于分离PHP代码和HTML内容,虽然我们不能从文件中删除所有的HTML内容,但可以移出绝大多数PHP代码。

    静态网站的模板框架

       首先,我们象前面一样为所有的页面公用元素以及页面整体布局编写模板文件;然后从所有的页面删除公共部分,只留下页面内容;接下来再在每个页面中加上三行PHP代码,如下所示:

    <?php

    <!-- home.php -->
    <?php require(/'prepend.php/'); ?>
    <?php pageStart(/'Home/'); ?>

    <h1>你好</h1>
    <p>欢迎访问</p>
    <img src=/"demo.jpg/">
    <p>希望你能够喜欢本网站</p>

    <?php pageFinish(); ?>

    ?>

       这种方法基本上解决了前面提到的各种问题。现在文件里只有三行PHP代码,而且没有任何一行代码直接涉及到模板,因此要改动这些代码的可能性极小。此外,由于HTML内容位于PHP标记之外,所以也不存在特殊字符的处理问题。我们可以很容易地将这三行PHP代码加入到所有静态HTML页面中。

       require函数引入了一个PHP文件,这个文件包含了所有必需的与模板相关的PHP代码。其中pageStart函数设置模板对象以及页面标题,pageFinish函数解析模板然后生成结果发送给浏览器。

       这是如何实现的呢?为什么在调用pageFinish函数之前文件中的HTML不会发送给浏览器?答案就在于PHP 4的一个新功能,这个功能允许把输出到浏览器的内容截获到缓冲区之中。让我们来看看prepend.php的具体代码:

    <?php

    require(/'class.FastTemplate.php/');

    function pageStart($title = /'/') {
    GLOBAL $tpl;
    $tpl = new FastTemplate(/'./');
    $tpl->define( array( /'main/' => /'main.htm/',
    /'header/' => /'header.htm/',
    /'leftnav/'=> /'leftnav.htm/' ) );
    $tpl->assign(/'TITLE/', $title);
    ob_start();
    }

    function pageFinish() {
    GLOBAL $tpl;
    $content = ob_get_contents();
    ob_end_clean();
    $tpl->assign(/'CONTENT/', $content);
    $tpl->parse(/'HEADER/', /'header/');
    $tpl->parse(/'LEFTNAV/', /'leftnav/');
    $tpl->parse(/'MAIN/', /'main/');
    $tpl->FastPrint(/'MAIN/');
    }

    ?>

      pageStart函数首先创建并设置了一个模板实例,然后启用输出缓存。此后,所有来自页面本身的HTML内容都将进入缓存。pageFinish函数取出缓存中的内容,然后在模板对象中指定这些内容,最后解析模板并输出完成后的页面。

       这就是整个模板框架全部的工作过程了。首先编写包含了网站各个页面公共元素的模板,然后从所有页面中删除全部公共的页面布局代码,代之以三行永远无需改动的PHP代码;再把FastTemplate类文件和prepend.php加入到包含路径,这样你就得到了一个页面布局可以集中控制的网站,它有着更好的可靠性和可维护性,而且网站级的大范围修改也变得相当容易。

       本文包含了一个可运行的示例网站,它的代码注释要比前面的代码注释更详细一些。FastTemplate类可以在http://www.thewebmasters.net/找到,最新的版本号是1.1.0,那里还有一个用于保证该类在PHP 4中正确运行的小补丁。本文下载代码中的类已经经过该补丁的修正。

    返回 Top

    15、网站设计65条原则

        设计网站中有哪些关键技巧?有哪些陷阱?在这里,世界上一流的网站设计专家,让你共享他们的秘密,告诉你:使网站赋予情趣的诀窍、应该避免做什么、应使用什么工具软件以及他们喜爱和厌恶的网站。
      01 明确内容
      如果你想成为一个网站设计者,并正想建一个网站的话,首先应该考虑网站的内容,包括网站功能和你的用户需要什么。你的整个设计都应该围绕这些方面来进行。
      02 抓住用户
      如果用户不能够迅速地进入你的网站,或操作不便捷,网站设计就是失败的。不要让用户失望而转向你的对手的网站。
      03 优化内容
      内容是核心。大约在两年以前,企业网站就像一本广告册子,更槽糕的是,网站使用了大量的图片,似乎要几个世纪才能下载完。
      Chanels网站(www.channels.co.uk)在设计的某些方面是成功的,但是内容太贪乏,并且要花很长时间才能找到所要的东西,因此不能算是一个成功的网站。
      04 快速下载
      没有什么比要花很长时间下载页面更槽糕的了。作为一条经验,一个标准的网页应不大于60K,通过56K调制解调器加载花30秒的时间。有的设计者说网页加载应在15秒内。
      05 网站升级
      时刻注意网站的运行状况。性能很好的主机随着访问人数的增加,可能会运行缓慢。但是,如果你不想失去访问者的话,一定要仔细计划好你的升级计划。
      06 坚持基本原则
      即使你不懂HTML语言,你只需购买一个有版权的所见即所得的网页设计工具,如Adobe PageMill 或 Microsoft FrontPage Express,就可以创建一个看起来很合理的网站。但是,在设计时,这些软件包虽然不需要HTML,却使网站速度下降。
      为了成功地设计网站,你必须理解HTML是如何工作的。大多数的网站设计者建议网络新手应从有关HTML的书中去寻找答案,用Notepad制作网页。
      07 学习HTML
      用HTML设计网站,可以控制设计的整个过程。但是,如果你仅仅是网站设计的新手,你应该寻找一个允许修改HTML的软件包。HomeSite4是一个很好的Web设计工具。在设计过程中,HomeSite4能帮助你学习HTML。它还允许你切换到所见即所得的模式,以便你在把网站发送到Web之前,预览你的网站。
      08 用笔画一个网站的框架
      圣人云:笔比剑更强大。在用计算机之前,用笔画一个网站的框架,显示出所有网页的相互关系。计划好你的用户如何以最少的时间浏览你的网站。
      09 /"在计算机上永远也找不到好的方案/"。 --专家忠告
      10 网站地图
      许多设计者把他们的网站地图放在网站上,这种做法,却是弊大于利。绝大部分的访问者上网是寻找一些特别的信息,他们对于你的网站是如何工作的,并没有兴趣。如果你觉得你的网站需要地图,那很可能是需要改进你的导航和工具条。
      11 /"睁大你的眼睛,留意所有的事情。对最不相关的东西的观察可以得到最好的灵感。观察一个站点的结构和设计。理解站点结构的关键元素,确保你的设计是围绕站点浏览进行的。/"    --专家忠告
      12 点击规则
      听说过3次点击规则吗?对于小型网站,在你的主页上,没有任何一条信息,需要点击次数超过3次的。对于大型网站,使用导航和工具条来改善操作。
      13 特殊字体的应用
      虽然你可以在你的HTML中使用特殊的字体,但是,你不可能预测你的访问者在他们的计算机上将看到什么。在你的计算机里看起来相当好的页面,在另一个不同的平台上看起来可能非常糟糕。一些网站设计员喜欢使用来定义特性,这虽然允许你使用特殊的字体,但是仍需要一些变通的方法,以免你所选择的字体在访问者的计算机上不能显示。级联风格表CSS有助于解决这些问题,但是只有最新版的浏览器才支持CSS。
      14 /"使用切合实际的简便的命名规则。/"    --专家忠告
      15 检查错别字
      好的拼写是人们一生中重要的技能。但是遗憾的是,许多设计者都缺少这种技能。确保你拼写正确,并且格外注意平常容易误写的错别字。
      16 避免长文本页面
      在一个站点上有许多只有文本的页面,是令人乏味的,且也浪费Web的潜力。如果你有大量的基于文本的文档,应当以Adobe Acrobat格式的文件形式来放置,以便你的访问者能离线阅读。
      17 不要使用卷滚条
      人们厌恶在网上使用卷滚条。Trouble网站(www.Trouble.co.uk)是一个典型的设计很差的网站。它基于一个浮动的架构,为了阅读所有的文本,浏览者不得不使用卷滚条。
      18 专家最喜爱的Web设计工具
        1.Adobe Photoshop
        2.Macromedia Flash
        3.Adobe Illustrator
        4.Adobe ImageRead
        5.Dreamweaver
        6.Macromedia Fireworks
        7. Allaire Homesites
        8.Microsoft Notepad
        9. Macromedia Director
        10. Lightwave
        11. Macromedia Freehand
        12.其它:Adobe Acrobat Exchange,Allaire ColdFusion,BBEdit,Editplus,HTML Validator等。
      19 网站介绍
      你应当有一个很清晰的网站介绍,告诉访问者你的网站能够提供些什么,以便访问者能找到想要的东西。但是,许多设计者都没有这样做。有效的导航条和搜索工具使人们很容易找到有用的信息,这对访问者很重要。告诉访问者你所提供的正是他们想要的信息。
      20 /"网站一旦发布,网站设计的优点和缺陷全都公布于世。没有什么方法使你能够比从自己的错误、倾听其他人的建议和用户反馈意见中学到更多的东西。/" --专家忠告
      21 闪烁让人头痛
      通过使用标识可以吸引访问者对你的主页特殊部分的注意,但这也让你的访问者头痛。如果你想使访问者再次光顾你的网站,就少用此方法。
      22 背景颜色
      背景颜色也会产生一些问题,可能会使网页难于阅读。你应当坚持使用白色的背景和黑色的文本,另外还应当坚持使用通用字体。
      23 向前和向后按钮
      应当避免强迫用户使用向前和向后按钮。你的设计应当使用户能够很快地找到他们所要的东西。绝大多数好的站点在每一页同样的位置上都有相同的导航条,使浏览者能够从每一页上访问网站的任何部分。
      24 /"坚持你的信念。严格遵守各种规则。避免想当然。绝不停止学习。/"    --专家忠告
      25 点击记数器
      不要轻易考虑在你的网站上放置一个醒目的点击记数器。你设计网站是为了给访问者提供服务,而不是推销你自己认为重要的东西。大多数浏览者认为计数器毫无意义,它们很容易被做假,浏览者也不想看广告。如果你显示你的网站是多么受欢迎,你最好提供一个链接,显示访问日志。
      26 不要用框架
      与记数器一样,框架在网页上越来越流行。在大多数网站上,在屏幕的左边有一个框架。但是设计者立刻就发现,在使用框架时产生了许多的问题。使用框架时如果没有17英寸的显示屏几乎不可能显示整个网站。框架也使得网站内个人主页不能够成为书签。也许更重要的是,搜索引擎常常被框架混淆,从而不能列出你的网站。
      27 去掉图像
      在浏览器中即使去掉了图像功能,也要保证访问者能够在你的网站上获得满意的效果。对于那些使用ISDN连接并且关掉了图像功能的访问者,还能获得好的网页加载性能。可以通过在网页底部提供另外的链接和使用替代文字,而不是图像来满足访问者的需要。
      28 重复使用图像
      一些网站由于使用大量不重复的图像而错过了使用更好的技巧的机会。在创建商标时,在网页上多次使用同样的图像是一个好的方法,并且一旦它们被装入,以后重新载入就会很快

      29 避免使用过大的图像
      不要使用横跨整个屏幕的图像。避免访问者向右滚动屏幕。占75%的屏幕宽度是一个好的建议。
      30 /"避免使用炫耀的技巧。/"    --专家忠告
      31 选择使用Flash动画
      许多使用比较慢的计算机的访问者发现动画图标很容易耗尽系统资源,使网站的操作变得很困难,因此,应该给用户一个跳过使用Flash动画的选择。
      32 尽量少使用Flash插件
      虽然许多Web设计者认为Flash功能很强大,并且Netscape5.0将支持Flash,在使用时不必再下载任何插件。但是,最好还是取消使用Flash做各接口的想法。
        33 让用户先预览小图像
     
      如果不得不放置大的图像在网站上,就最好使用Thumbnails软件,把图像的缩小版本的预览效果显示出来,这样用户就不必浪费金钱和时间去下载他们根本不想看的大图像。
      34 动画与内容应有机结合
      确保动画和内容有关联。它们应和网页浑然一体,而不是干巴巴的。动画并不只是Macromedia Director等制作的东西的简单堆积。
      35 慎用声音
      声音的运用也应得到警惕。内联声音是网页设计者的另一个禁地。因为过多地使用声音会使下载速度很慢,同时并没有带给浏览者多少好处。首次听到鼠标发出声音可能会很有趣,但是多次以后肯定会很烦人。使用声音前,应该仔细考虑声音将会给你带来什么。
      36 少用Java 和AxtiveX
      在网页上应尽量少使用Java 和AxtiveX。因为并不是每一种浏览器都需要使用它,只有那些Netscape 和Explorer的早期版本的使用者才需要它。另外Mac在处理Java时也存在问题,过分地使用Java,会使Mac崩溃。
      37 设计成功的网站
      www.bmw.co.uk   --内容和关联性很好
      www.yugop.com   --图形下载很快
      www.comicrelief.org.uk   --设计简单明了
      www.dreamcast-europe.com   www.newsunlimited.co.uk   www.newbeetle.com   www.swoon.com   www.viaduct.co.uk
      38 慎用插件
      在Web设计中,如果依赖于一些特别的插件,会减少网站的吸引力。如果访问者没有所要求的插件,将不得不到其它站点去下载,这样访问者有可能就不会返回了。
      39 使用著名的插件
      如果网站上有声音或视频,要保证使用者通过使用某个知名的插件,能够听到或看到。许多站点使用QuickTime、RealPlay和 Shockwave插件。因为,许多访问者并不愿意浪费很多时间和金钱去下载可能仅使用一次的插件。
      40 使用先进技术
      跟上新的技术。Web技术的进步绝不会停止,所以应花一些时间来研究新产品和开发技术。
      41 自己创建图像和声音
      使用你自己创建的或从某个商业网站上下载的图像和声音。在制作商业网站时,应该花足够的资金来创建图形,以增强公司的宣传。
       --专家忠告  
      43 平台的兼容性
      要为用户着想,必须最少在一台PC 和一台Mac机上测试你的网站,看看兼容性如何。
      44 用软件分析工具找错
      使用软件分析工具检查HTML。软件分析工具Doctor HTML能够帮助检查HTML中的任何问题。如果你有许多网页需要检查,可选用软件分析工具。在网址www.weblint.org/validation.html中,你能够找到更多有效的HTML工具。
      45 避免错误链接
      网站中可能与其它一些有用的站点作了链接。但是,如果在你的网页上有链接,一定要经常检查它们,保证链接有效。链接的网站可能很多,但不要链接到与你的内容无关的网站上。
      46 给观众成熟的东西
      如果网站没有完成,就不要发送到Web上。所有好的网站都是在幕后完成之后再发布的。
      47 在搜索引擎上登记网站
      任何一个人发现你的网站的机会都很少,除非你把你的网站在主要的搜索引擎上进行登记。
      48 设计一个留言板
      浏览者愿意把时间花在好的网站上,所以最好有一个留言本,这能激励访问者再次回到你的网站,还有助于扩充网站内容。
      49 测试网站
      在你的网站正式发布之前,必须进行有用的测试。在设计网站时要使用最新的软件,但是不要忘了人们并不会使用最新的浏览器,所以要照顾到以前的浏览器。在上载网站时还要测试所有的链接和导航工具条。
      50 /"尽你所能反复测试所设计的网站,直到你不能发现新的东西为止。/"    --专家忠告
      51 演示即将发布的网站
      在网站正式运行之前,让人演示它。演示中人们会告诉你所设计的网站是否容易使用。
      52 动画点缀
      网页上的动画最多只用一个。
      53 /"倾斜的按钮看起来不会太好,最好不要使用。/" --专家忠告
      54 内容组织
      在开始创建新的网页前,仔细考虑网站内容的组织。决定好想让访问者浏览的内容,然后设计导航系统。
      55 /"空白万岁/"
      注意留空白。不要用图像、文本和不必要的动画GIFs来充斥网页,即使有足够的空间,在设计时也应该避免使用。
      56 /"利用空白去吸引注意力。为了吸引眼球,Web设计者使用各种方法,比如:闪烁、旋转等,但是利用空白会吸引更多的注意力。/" --专家忠告
       57 图像压缩
      为了保持小的图像,可以使用类似GIF向导的程序,它能自动对图像进行压缩。
      先声明图像的大小
      在图像显示之前最好能详细说明图像大小属性,可以在IMG标签中保存这个属性。这可以使网页显得很流畅,因为浏览器可以在图像被下载之前在屏幕上显示整个网页。
      58 设计失败的网站
      www.boo.com
      --在它上面找一件T恤衫要花一个小时;
      --给顾客承诺的服务太多,但真正实现的太少;
      --二年以前的设计水平,忽视了顾客的需要;
      www.miniheroes.co.uk
      --不吸引人,主页太雷同
      www.saturn.com
      --设计太差
      www.e13.com.
      --没有新意
      www.song.com.
      --导航不知所云
      59 图像大小属性,可以在IMG标签中保存这个属性。这可以使网页显得很流畅,因为浏览器可以在图像被下载之前在屏幕上显示整个网页。
      60 用户注册
      如果能知道谁浏览了网站以及是怎样浏览网站的,那么就能得到大量有用的信息。但是,要求访问者在浏览网站之前进行注册,这样做是要冒风险的,因为这将赶走一批不愿意注册的人。获得信息的另一种方法是进行有奖竞猜或金钱奖励,让用户能主动填一些信息反馈表。
      61 使网站具有交互功能
      在网站上提供一些回答问题的工具,使得访问者能从网站上获得交互的信息。
      62 图片更新
      尽可能经常更换网站上的图片,人们更愿意点击的是图片而不是文本。
      63 在网站上提供游戏
      游戏是很好的交互工具,它是使访问者能再次光顾网站的好方法。
      64 挑选工具软件
      仔细选择Web设计工具。保证使用自己最想要的、自我感觉最好的软件。
      65 使用最新版本的软件
      尽量使用Web设计软件的最新版本,还应当能被授权进行免费或便宜的升级。

    返回 Top

    16、网站策划书参考

    网站总策划

      首先在做网站之前给要做的网站一定准确的定位,没有方向的船哪边的风都不会是顺风。所以给网站定位,明确建站目地是第一步要做的。给网站做定位时,与公司决策层人士共同讨论,以便于让上层领导能对网站的发展方向有一定的把握,同时最好调动公司其他部门一起参于讨论,及时从公司立场提出好的见意,结合到策划中去。一个公司的好坏与部门之间工作结合的是否紧密是有着很大关系的!

    前期信息收集

      在明确建站目的和网站定位以后,开始收集相关的意见,跟公司其他部门结合,跟公司的实际情况结合,这样可以发挥网站的最大作用。
      这一步是前期策划中最为关键的一步,因为做网站一定是为公司服务的,所以收集其他部门的意见和想法是最为必要的,这一步需要整理成文档,可以让其他部门配合提交一份本部门需要在网上开辟的栏目计划书,这份计划书呢,一定要考虑充分,因为如果要把网站做为一个正式的站点来运营的话,所做的每一项栏目的设置都应该是有规划的,如果考虑不充分会导至以后突如其来的新加内容破坏网站的整体规划和风格,这也并不意味着网站成形后是不许添加栏目的,只是在添加的过程中需要跟网站的情况结合着来,也最好是当初策划时考虑全面!

    具体分栏目策划

      收集完其它各部门的相关信息以后,对其进行整理,整理以后找出重点,根据重点以及公司业务的侧重点,结合网站定位来敲定网站的分栏目需要有哪几项,可能开始时会因为栏目较多进而难以确定最终需要哪几项,这又是一个讨论的过程,需要大家在一起把自己的意见说出来,一起反复比较,给定下来的内容进行归类,形成网站栏目的树状列表用以清淅表达站点结构。
      然后以同样的方法,来讨论二层栏目下的子栏目,对它进行归类,并逐一确定每个二级分栏目的主页面需要放哪些具体的东西,二级栏目下面的每个小栏目需要放哪些内容,让栏目负责人能够很清楚的了解本栏目的每个细节和每个栏目,大家讨论完以后,就应由栏目负责人来按照讨论过的结果写栏目规划书,栏目规划书要求写得详细,具体。并有统一的格式,以备网站留档,这次的策划书只是第一版本,以后在制作的过程当中如果出现问题及时修改该策划书,并且也需要留档。策划书要求有电子版和书面版两份。
      下面就是需要说一下策划书设计到的具体内容。每个栏目的策划书应该是格式统一的。
      第一,是栏目概述,其中包括栏目定位,栏目目的,服务对像,子栏目设置,首页内空,分页内容!这一部分起到一个索引的作用,让领导看起来能对栏目有一个大概的整体把握和了解。
      第二,为栏目详情。栏目详情就是把每一个子栏目的具体情况描述一下,其中包括到各个子栏目的名称,
    栏目目的,(把子栏目的目的写清楚)
      服务对像,(用以明确栏目的发展方向,更好的为达到目的而做哪些具体内容)
      内容介绍,(详细说明本子栏目的具体内容)
      资料来源,(说明该栏目的内容来源是什么,以保证栏目开展下去不会出现没有内容的情况)
      实现方法,(讲述实现这个栏目的具体方法)
      有关问题,(栏目负责人在栏目的策划过程当中想到的,目前尚未解决的问题)
      重点提示(重点提示美工人员或编程人员需要注意的地方,或需要结合的地方,也可是栏目策划人员对该子栏目在这些方面的良
    好见意)
      第三,相关栏目,这一项是用以说明本栏目和其它栏目之间的结合,沟通,之所以要有这一项是想通过各个栏目之间的联系,来加强网站的整体性。第四,参考网站,标明本栏目参考了哪些网站,或可以参考哪些网站。并一定要说明参考其它网站的哪些优点,哪些地方是我们在建设过程当中应该注意的。决不是只写上一个网址就可以了!
      第四,最后一项为附录,用以记录这个文档的历史修改过程,和改了哪些内容。
      好了,策划书的内容格式就这么多了,可能会觉得多了些繁锁了些,不过,要知道策划书是写给我们自己的,不是为了让别人看,而是我们网站在以后的建设过程中的一个依据。有了这个策划书以后的工作我们可以很轻松的解决! 具体设计制作(包括页面设计,制作,编程)
      再接下来,需要做的就是让页面设计人员跟根每个栏目的策划书来设计页面,重申一下,在设计之前应该让栏目负责人把需要特殊处理的地方和设计人员讲明!在设计页面时设计人员一定要根据策划书把每个栏目的具体位置和网站的整体风格确定下来,为了让网站有整体感,应该在网页中放置一些贯穿性的元素,最终要拿出至少三种不风格的方案,每种方案应该考虑到公司的整体形象,与公司的精神相结合。设计方案拿出以后,由大家讨论定稿。
      设计完成下一步是实现,由制作人员负责实现网页,并制作成模版。在这个过程实现的同事,栏目负责人应该开始收集每个栏目的具体内容并整理。模版制作完成后,由栏目负责人往每个栏目里面添加具体内容。
      网站的建设计应该是同时进行的,这如何统筹是一个比较重要的问题。在上面所讲述的过程进行的同时,网站的程序人员应该正是处于开发程序的阶段,如果实现的这个过程中出现什么问题编程人员应和制作人员及时结合,以免程序开发完成后发现问题要进行大规模的反工。

    整合测试

      接下来,当两边的工作都完成以后,就是整合。把程序和页面时行整合。整合完以后,需要内部测试,测试完成,没有问题以后就可以ok啦!

    返回 Top

    17、网站规划书浅析

      一个网站的成功与否与建站前的网站规划有着极为重要的关系。在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模、投入费用,进行必要的市场分析等。只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行。
     
      网站规划是指在网站建设前对市场进行分析、确定网站的目的和功能,并根据需要对网站建设中的技术、内容、费用、测试、维护等做出规划。网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用。
     
      网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规划书的写作要科学、认真、实事求是。

      网站规划书包含的内容如下:

    一、建设网站前的市场分析

      1、相关行业的市场是怎样的,市场有什么样的特点,是否能够在互联网上开展公司业务。

      2、市场主要竞争者分析,竞争对手上网情况及其网站规划、功能作用。

      3、公司自身条件分析、公司概况、市场优势,可以利用网站提升哪些竞争力,建设网站的能力(费用、技术、人力等)。

    二、建设网站目的及功能定位

      1、为什么要建立网站,是为了宣传产品,进行电子商务,还是建立行业性网站?是企业的需要还是市场开拓的延伸?

      2、整合公司资源,确定网站功能。根据公司的需要和计划,确定网站的功能:产品宣传型、网上营销型、客户服务型、电子商务型等。

      3、根据网站功能,确定网站应达到的目的作用。

      4、企业内部网(Intranet)的建设情况和网站的可扩展性。

    三、网站技术解决方案

      根据网站的功能确定网站技术解决方案。

      1、采用自建服务器,还是租用虚拟主机。

      2、选择操作系统,用unix,Linux还是Window2000/NT。分析投入成本、功能、开发、稳定性和安全性等。

      3、采用系统性的解决方案(如IBM,HP)等公司提供的企业上网方案、电子商务解决方案?还是自己开发。

      4、网站安全性措施,防黑、防病毒方案。

      5、相关程序开发。如网页程序ASP、JSP、CGI、数据库程序等。

    、网站内容规划

      1、根据网站的目的和功能规划网站内容,一般企业网站应包括:公司简介、产品介绍、服务内容、价格信息、联系方式、网上定单等基本内容。

      2、电子商务类网站要提供会员注册、详细的商品服务信息、信息搜索查询、定单确认、付款、个人信息保密措施、相关帮助等。

      3、如果网站栏目比较多,则考虑采用网站编程专人负责相关内容。 注意:网站内容是网站吸引浏览者最重要的因素,无内容或不实用的信息不会吸引匆匆浏览的访客。可事先对人们希望阅读的信息进行调查,并在网站发布后调查人们对网站内容的满意度,以及时调整网站内容。

    五、网页设计

      1、网页设计美术设计要求,网页美术设计一般要与企业整体形象一致,要符合CI规范。要注意网页色彩、图片的应用及版面规划,保持网页的整体一致性。

      2、在新技术的采用上要考虑主要目标访问群体的分布地域、年龄阶层、网络速度、阅读习惯等。

      3、制定网页改版计划,如半年到一年时间进行较大规模改版等。

    六、网站维护

      1、服务器及相关软硬件的维护,对可能出现的问题进行评估,制定响应时间。

      2、数据库维护,有效地利用数据是网站维护的重要内容,因此数据库的维护要受到重视。

      3、内容的更新、调整等。

      4、制定相关网站维护的规定,将网站维护制度化、规范化。

    七、网站测试

      网站发布前要进行细致周密的测试,以保证正常浏览和使用。主要测试内容:

      1、服务器稳定性、安全性。

      2、程序及数据库测试。

      3、网页兼容性测试,如浏览器、显示器。

      4、根据需要的其他测试。

    八、网站发布与推广

      1、网站测试后进行发布的公关,广告活动。

      2、搜索引掣登记等。

    九、网站建设日程表

      各项规划任务的开始完成时间,负责人等。

    十、费用明细

      各项事宜所需费用清单。

      以上为网站规划书中应该体现的主要内容,根据不同的需求和建站目的,内容也会在增加或减少。在建设网站之初一定要进行细致的规划,才能达到预期建站目的。

    返回 Top

    18、帮你免于失业的十大软件技术

    能跟上关键技术的发展,是你在就业市场和未来保持优势的最佳手段。你对我们列出的十门技术精通吗?哪怕是大略精通? --     罗素·琼斯,执行编辑 2002年12月11日

    我不知道你的具体工作是什么。如果你是某冷门领域的专家而变得不可或缺,或者你们的公司十分稳固,以你现有的技术就足以安度你的职业生涯,那我不知道你是否有失业的危险。不管怎样,请你先不要急着寄出那些告诉我你们的公司对用VB3十分满意或你们除C以外永不用其它语言的信件,并保留起那些讲述.NET将如何把Java扫地出门、XML将如何取代关系型数据库、或你怎样能用汇编语言或C写任何软件而任何其它开发工具都不重要的信件。

    现在,想象一下如果你像很多受裁员和公司倒闭影响的同行一样失去了工作,那将会怎样。如果你突然需要搬往它处该怎么办?如果你的公司突然做了技术转向又怎么办?

    在目前的就业市场,经理们是根据当前和未来的开发需要招聘雇员。作为开发人员,你所掌握的知识是你找工作和保住工作的关键。你要了解技术的发展方向,跟上技术的变化,这一点十分重要,即使你永远不用再找开发方面的工作。

    这里是我选出的当前最重要的十大开发技术,最重要的排在前面。看完本文后,请务必加入talk.editors.devx讨论组,提出你选出的十大技术。

    1. XML
    首先,你要了解XML。我不是说仅仅是XML规格本身,还包括一系列相关的基于XML的语言:最重要的是XHTML、XSLT、XSL、DTDs、XML Schema (XSD)、XPath、XQuery和SOAP。那些在过去5年内从未碰过键盘的人,可能不知道XML为何物。XML是一种文本文件,使用与HTML类似的标记。XML能定义一个树状结构,并能描述所含的数据。
    XML最好的一点是既能存结构化数据也能存非结构化数据。它既能存贮和描述“规格的”(regular)表格数据,也能容纳和描述“粗糙的”(ragged)文件数据。
    XHTML是现今写HTML的首选方法。因为它是形式完好(well formed)的XML,比起古老的、通常是畸形(malformed)的HTML文件,XHTML格式的文件更容易处理。
    XSLT和XSL是用于把XML文件转成其它格式的语言。可转换的格式包括:文本文件、PDF文件、HTML、以逗号为分隔符的文件,或其它XML文件。 DTD和XML Schema描述XML文件所能包含的内容的类型,并让你“验证”XML文件内容的合理性,而不用写特殊代码以确保内容符合规则要求。
    XPath和XQuery是用于从XML文件中抽取单个项目或一组项目的查询语言。XQuery扩展了XPath,因而更重要。XQuery与XML的关系正像SQL与关系数据库的关系。
    SOAP是Web服务之间的一个标准通讯协议。尽管你不需要对SOAP标准一清二楚,你应该熟悉一般的schema和它的工作原理,以便能应用这门技术。

    2. Web服务
    Web服务是XML流行后的一个直接产物。因为你能用XML描述数据和物件,因为你能用schema确保XML文件内容的合理性,因为XML是基于文本的规范,XML为跨平台通讯标准提供了一个极其方便的基本格式。如果你还从来没碰到Web服务,你可能很快就会碰到,在未来5年内,你几乎肯定会碰到。熟悉Web服务十分重要,因为它是目前所有跨不同机器、不同语言、不同平台和不同地点的通讯协议中最简单的一个。不管你需要与否,Web服务是迈向互用性的重要一步。

    XML工作组主席John Bosak曾说XML“给Java一些事做”。实际上,Web服务让所有语言都有了一些事做。Web服务让在大型机上运行的COBOL应用软件能调用在手持设备上运行的Java应用程序、能让Java applet与.NET服务器交谈、能让微机软件与Web服务器无缝连接,并提供了一个相对容易的方法,让企业不光能向外界提供数据,还能提供功能,而且是一种与语言、平台和位置都独立的方法。

    3. 面向对象的编程
    很多程序员仍认为OOP是象牙塔里的技术。但如果你想一下是什么语言在过去的10年里占主导地位,你就会理解OOP不是象牙塔里的技术。OOP从Smalltalk开始,传到C++和Pascal (Delphi)。Java使OOP大踏步地迈向主流,几年后的VB.NET和C#则完全确立了OOP的优势地位。尽管这些语言中的多数并不要求你必须会OOP,但我觉得如果你不了解OOP的基本概念也不知道如何应用这些概念,你能找到的编程工作将越来越少。

    4. Java、C++、C#和VB.NET
    我把这些语言列在一起,并不是建议你成为每一种语言的专家。我的理由是:学习编程最有效的方法之一是看代码,而你能看到的大量的代码很可能不是用你所喜爱的语言编写的。

    在过去几年,各语言的能力越来越接近。现在,你可以用VB.NET写Windows服务、Web应用程序或命令行程序。即使你只使用一种语言,你也应该学一些其它语言,以便能看懂那些样例,并将其翻译到你所用的语言。这4种语言是基本核心,还有其它一些满足不同需要、颇具用途的语言,如FORTRAN、COBOL、APL、ADA、Perl和Lisp。

    5. JavaScript
    尽管名字有些相像,但Java与JavaScript并无关联。为什么一个脚本语言会如此重要呢?因为所有主流浏览器都用JavaScript。如果你需要写Web应用程序,你就有足够的理由学JavaScript。JavaScript可以用作ASP或ASP.NET的服务器语言,也可以当做用于扩展XSLT的功能语言(functional language)。JavaScript是Mozilla/Netscape中用于激活基于XUL的程序接口的首选语言。JavaScript的一个变种ActionScript是Flash MX的编程语言。将来,JavaScript很可能成为新设备的编程语言,以及大型应用软件中的宏语言。

    与JavaScript相对照的是VBScript。尽管Microsoft的软件对VBScript有良好的支持,但VBScript在未来的开发工作中很可能是一个糟糕的选择。就是Microsoft也倾向于用JavaScript(或Microsoft自己的变种:JScript)写客户端程序。在选择脚本语言时,请选择JavaScript。

    6. 正则表达式(Regular Expressions)
    查寻关系数据库可以用SQL,查询XML可以用XPath和XQuery,查询纯文本文件则可以用正则表达式。例如,你可以用一个命令从一个HTML文件中查找并删除所有的注释。各种开发语言内置的一些简单的文本查询功能,如/"IndexOf/"函数或VB中经典的/"InStr/"函数或/"Like/"操作符,根本不能与正则表达式相提并论。现在,各种主要的开发语言都提供使用正则表达式的途径。尽管正则表达式本身既难懂更难读(是回到早期计算机时代的一种倒退),但它却是一个功能强大而且未被充分利用的工具。

    7. 设计模式
    正像OOP通过把对象分类以简化编程一样,设计模式对一些普遍的对象之间的交互进行分类,并赋予一个恰当的名称。OOP用得越多,设计模式就越有用。一些最常用的模式的名称已经变成了软件开发领域共同使用的术语,所以要跟上信息的主流,你就要对设计模式有相当的理解。

    8. Flash MX
    如果你需要在客户端得到比HTML和CSS更多的图形和更强的编程功能,Flash是你的答案。用Flash编程比开发Java applets或写.NET代码要快得多,也容易得多。
    在最新版本 (MX) 中,Flash不仅仅是画图和制造动画的工具,它已经成为一个编程功能强大的开发环境:能调用SOAP Web服务,也能调用远端服务器上的ColdFusion、Java或.NET程序。Flash无处不在。它的引擎存在于世界上大多数客户端计算机,包括手持设备、置顶盒、甚至是新的书写板电脑。所以使用Flash能大大扩展你的程序的应用范围。

    9. Linux/Windows
    熟悉Linux。在一台旧机器或新机器上安装Linux。下载图形用户界面,在其基础上写一些程序。安装Apache,写一个Web应用程序。这个世界不再仅仅是属于Windows,这种趋势可能还会持续下去。如果你是一名中坚的Linux开发人员,那就抛弃你对Windows的憎恶,看看你能否做一些Windows编程。Windows能继续在台式电脑上称王是有其原因的,这不仅仅是因为Microsoft控制了这个市场。

    没人知道你们公司会在什么时候决定从Linux转向Windows(或从Windows转向Linux),或者你想跳到一家用另一种平台的公司,或者你想出了开发一个杀手软件的好主意,所以你要争取拥有在不同操作系统上的编程经验。

    10. SQL
    尽管SQL不像本文讨论的其它技术那样新,而且SQL的重要性在未来10年内很可能降低,但它仍然是一项基本技能。很多开发人员还没有掌握这门技术,或掌握得不够,不足以有效率地使用它。不要依赖具有图形用户界面的SQL生成器替你做事情,你要自己手工地写查询命令,直到你熟悉基本的SQL语法为止。了解SQL不仅能帮助你日后学习XQuery,你还有可能马上发现能简化或改进目前项目的方法。

    培养好奇心
    最后,(对,我意识到这是第11门技术),好奇心是你最重要的技能。要去尝试各种东西。新语言或新技术对你当前或将来的工作可能有用,也可能没用,但并不是你所学的每一件事都是为了工作。不要害怕失败,万事开头难,学新技术也是如此。大多数失败是因为人们希望太快地学到太多的东西。要对每一点进步感到满意,不要让时间(或缺乏时间)妨碍你。相反,你要安排时间留心、研究、试验新的开发技术和工具。

    你可能永远也没有必要成为这些技术的专家,而且我的选择可能根本不适合你的特殊情况,但通过培养好奇心,你将会发现你应该了解的东西。

    返回 Top

    19、使用PHP实现动态网页

          今天,Web站点费尽心思想要为用户提供他们从未体验过的东西。除了友好的界面,细致的服务,实用的信息以外,为用户定制的动态的网页内容也能够提高Web站点的用处并加强访问的针对性,这使得用户更有可能在以后再次访问你的网站。在这篇文章里,我们将从对动态信息的一个概述开始。然后我们将解释如何使用PHP来在Web页面里创建动态的内容并察看一个演示的例子。

    动态信息理论

    Merriam-Webster Online地解释,动态一词的意思是网页的内容由“通常是连续的和实时生成的活动或者改变的信息组成。”因此当我们谈论动态数据的时候,我们也就是在谈论作为Web页面发送给用户的信息是由不同的源数据组合而成的。这与静态网页的概念是相对的,静态网页的内容并不依赖用户输入的数据而改变而且通常是直接解析给用户。Web页面上的动态信息有三种主要的类型:

    • 动态数据--在一个Web页面里产生的变量。
    • 动态Web页面--整个Web页面都是动态生成的。
    • 动态内容--Web页面的一部分是动态生成的。

    你如果希望对动态内容产生的过程进行细微的控制,就象动态数据的那种类型一样,那么数据处理的过程就会复杂一些。而如果你想生成大范围的信息,就象动态Web页面的生成那样,那么程序的逻辑就会变得复杂。动态内容的生成是这两种方式的折衷,它能够让我们使用两个很有用的PHP函数,include()和require()。

    要记住,你在后端加入的逻辑越多,那么你的Web站点的性能将会损失得越严重。幸运的是,PHP能够很流畅的进行预处理过程,所以当我在处理动态内容和数据的时候都尽可能多的使用PHP的功能。

    数据源和PHP功能

    所有的动态内容都有一个共同点:它们从一个原始页面以外的数据源而来。图A列出了一些常见的数据源以及用来处理它们的相应的PHP函数。

    Figure A

    数据源 PHP 函数 注释
    User $HTTP_POST_VARS
    $HTTP_GET_VARS
    这些函数处理由用户通过Web表单直接输入的数据。
    Database (local or remote)

    <dbtype>_connect()
    <dbtype>_pconnect()
    <dbtype>_close()
    <dbtype>_<function>()
    example:
    mysql_fetch_array()

    这些都只是PHP许多数据库访问函数中的一部分,许多函数是为每个不同的数据库特别编写的。你能够在PHP函数参考手册里找到这些函数的完整列表。
    Remote file fopen(), fclose()
    fgets(), fputs()
    这些函数处理一个远程服务器上文件中的数据,这个文件可以通过FTP访问。
    Local file include(), require()
    fopen(), fclose()
    这些函数处理位于本地服务器上的文件中的数据,比方说配置文件。

    常见的数据源和处理它们的PHP函数

    在这篇文章“教程:PHP起步中,”我们观看了一个演示的脚本,这个脚本要求用户输入他们最喜欢的数字。根据用户输入的结果,我们在Web页面上显示一条消息。这就是一个由用户驱动的动态Web内容的例子。从Web表单返回的结果将决定显示的内容。一个更复杂的例子是“点击流程”应用程序,这个程序能够根据一个用户在Web站点上访问过的页面来决定向他或者她发送什么广告。

    一旦数据已经输入,不管它是由用户或者其它的方式输入的,将会被保存在一个数据库中并在以后重新使用。如果它被用来决定显示的内容,那么这些内容将可以被认为是“由数据库驱动的动态内容。”我们将在下一篇文章中更仔细的看看这种类型的动态信息。 目前,让我们先察看一个由文件驱动的动态内容的简单的PHP脚本的例子。我们将使用基于一个配置文件的逻辑来决定在Web页面上应该显示什么样的页面风格和字体。我们选择的页面风格将会在用户请求Web页面的时候显示出来。(这里我想就包括文件的例子给你提个醒:你真的应该在这个例子中为完成要求的功能而使用风格页。)

    例子程序:Display.php

    Display脚本使用一个独立的配置文件来包含变量值和几个含有HTML的变量部分的包括文件。虽然这看起来不是特别动态,但是你能够轻易的要求用户使用Web表单来创建一个配置文件并使用一定的逻辑来判断应该加载哪一个配置文件,等等。(我们在“理解PHP的函数和类”这篇文章中所作的讨论将帮助你完成这个工作。)

    由于本文的目的所限,我们将跳过这方面的处理过程并尽量使它简化。表A展示了我们的主页面,以及你通过浏览器调用的页面,Display.php。(PHP代码将用粗体进行显示。)

    表A

    这段简单的代码必须做三件事情:

    • 使用PHP include()函数来包含
      <!-- display.php 这个Web页面的风格由一个配置文件决定 --> 
      <html> 
      <head> 
      <title>Mood Page</title>
      </head> 
      <?php
       include("displayconf.php");
       $required_file = $display.".php";
       require $required_file;
      ?>
      <br><br>
      
      <center>This is the best "mood page" ever!</center>
      </font>
      </body>
      </html>
      

      Displayconf.php中的变量并对它们进行求值。

    • 创建一个表示用户请求的文件名的变量。在我们这个例子中,Displayconf.php文件里定义的变量$display被求值,然后加上.php后缀。(这是由我们的逻辑完成的。)
    • 使用PHP的require()函数显示正确的包含文件里的内容。

    你应该注意到在我们的例子中,PHP require()函数和include()函数是完全可以互换的。这两个函数之间主要的区别在于目标文件处理的方式不同。一个require()语句将会由它所调用的文件替换。这意味着在一个循环当中,远程的文件只会被调用一次。而另一方面,在每次遇到include()函数的时候,它都会被重新求值。这意味着在一个循环的过程中,文件将在每一次循环过程中都被访问一次,而且在包括文件中设置的变量每次都会更新。

    在这个例子中,我试图讲清楚什么时候使用什么函数合适。对于文件Displayconf.php,很有可能它里面的变量值已经改变。毕竟,这是一个配置文件。因此,我选择了include()函数。而另一方面,$required文件在交互的过程中很有可能不会改变。如果用户请求的是不同的文件体,那么我们有可能会创建一个新的文件再把它包括进来,所以我使用require()函数。

    高级用户可能希望看看PHP的手册来了解更多的关于函数require_once() 和 include_once() 的信息以便能够对文件处理和配置文件变量的管理进行更好的控制。

    表B 显示了我们的配置文件,Displayconf.php。(为了简单化的目的,我们将把所有的文件放在和Web服务器相同的目录下。)我们在这里要做的就是将$display变量设置成一个可选的值。

    表B

    <?php
    # displayconf.php # display.php 的配置文件 # ------------------------------------------------- # 将变量 $display 设置成下列值之一: # happy, sad, 或者 generic $display = "happy"; ?>

    最后我们需要一些内容文件--对应配置文件中的每一个选项。因为这些内容都是静态的HTML,所以我们不需要在文件里加上PHP脚标。当你在PHP里使用include()或者require()函数的时候,被调用的文件在处理过程开始的时候被跳过然后在处理结束的时候被加进来。

    "happy"文件内容(happy.php)
    <body bgcolor=pink text=yellow>
    <font size="+5">

    "Sad" 文件内容 (sad.php)
    <body bgcolor=blue text=white>
    <font face="arial, helvetica" size="+5">

    "Generic" 文件内容 (generic.php)
    <body bgcolor=white text=black>
    <font face="courier" size="+5">

    当你单击页面Display.php的时候,这个页面的外观和感受将会根据你在配置文件中输入的值而改变。

    总结

    在本文中,我们讨论了动态信息的基础知识并使用一个脚本来创建由文件驱动的动态内容。特别的是,我们使用include() 和 require() PHP函数来提取和发送我们的数据。

    下面是一些最后的话。虽然我相信你一定熟悉WAI Web编程指南,但是你也许还应该看看W3C对于动态内容所说的支配以及用户对它的访问能力。你可能还要看看PHP手册中的这一章“使用远程文件”来学习如何使用FTP来提取配置数据。

    返回 Top

    20、初学入门 PHP 和 MySQL

      我想要使用PHP和MySQL,但是如何安装和运行呢?什么是最基本的事情我应该知道的,以便让一个简单的PHP - MySQL应用程序工作?

      这是一个基本的教程。没有怪异的代码,只是一些基础。

      多说一句,现在有大量的教程是基于UNIX机器的,这个教程将集中在基于Windows平台上。然而,除了安装部分,有或多或少的针对于Windows的说明外,其它部分对所有的平台都是一样的。

      在这个教程中,我们将一步一步地建立一个小的网站,使用了PHP和MySQL的下面特性:

      1. 查看数据库;
      2. 编辑数据库的记录;
      3. 修改数据库的记录;
      4. 删除数据库的记录。

      我们将同时学习MySQL和PHP,一起去感觉它们。

    第一节 - 收集和建立必要的项目

      好,开始工作。为了开始PHP-MySQL我们需要一些准备:

      1. 运行web服务器;
      2. 增加PHP扩展;
      3. 运行MySQL。

      第一步,得到和安装Web服务器

      让我们假设一下在你的机器上已经有一个运行着的web服务器。在Windows下有几个好用的web服务器应用程序。要注意一件事,为了运行php/mysql你所选的web服务器应当可以支持扩展。

      一个在Windows上最容易安装的服务器是OmniHTTPd(http://www.omnicron.ab.ca/httpd/,它是一个非常好的自由web服务器。

      一旦你从站点上得到了安装文件,双击它并且安装web服务器。如果你在安装时全部选择了使用缺省值,那么你将会把它安装在c:/httpd下。一旦安装成功,安装程序将启动web服务器,带有一个欢迎窗口,在windows的系统托盘中可以看到一个新的图标。

      好了,第一步做完了。

      第二步,下载和安装PHP发行版

      得到PHP Win32发行版很容易:只要去http://www.php.net/download-php.php3,并且选择一个最好的位置就可以了。

      在OmniHTTPd上安装PHP非常简单。

      最先Unzip安装文件到你的硬盘上,比如展开在c:/php。

      拷贝文件'php3.ini-dist'到你的'%WINDOWS'目录下去,并改名'php3.ini'(在Win95/98为c:/windows,在WinNT/Win2k为c:/winnt)。

      按下面编辑php3.ini文件:

      改变'extension_dir'设置为你的PHP安装目录(c:/php),或存放'php3_*.dll'的目录。

      选择想在PHP启动时装入的模块。你应该将'extension=php3_*.dll'行的注释去掉来装入这些模块(一定要确认去掉了extension=php3_mysql.dll的注释)。一些模块要求有额外的库安装在你的系统上才能正常工作。

      PHP问答集(http://www.php.net/FAQ.php3)有更多关于如何得到支持库的信息。你可以通过使用:dl("php_*.dll")动态地装入一个模块。

      PHP扩展库以'php3_'为前缀。这个可以防止在PHP扩展与它们的支持库之间发生混淆。

      现在跟着简单的步骤配置OmniHTTPd:

      在系统托盘中右击蓝色的OmniHTTPd图标,选项属性(Properties)项;

      点击Web Server Global Settings项;

      点中'External'tab标签。现在,在"Virtual"域中输入".php3",在"actual"域中输入"c:/php/php.exe",然后单击"Add"。

      选择Mime tab标签并且在"Vritual"中输入"wwwserver/stdcgi",在"Actual"中输入".php3",并单击"Add"。

      单击 OK。

      在同一个窗体中选择Default Virtual Settings;

      现在单击Server tab标签;

      在"Default Index"域中输入"Index.php3"(用逗号分隔)。这将告诉web服务器也可以识别index.php3文件。

      单击 OK。

      好,足够了。让我们测试一下PHP是否在工作:

      创建一个名为index.php3的文本文件,写入下面的文本:

    <?
    echo "I made it!";
    ?>

      启动你的浏览器,并指到localhost。你应该在屏幕上得到"I made it!"。

      下面,得到和安装MySQL:

      去http://www.mysql.com/download_win.html,下载MySQL-Win32发行版,将zip文件解压到一个临时目录并且运行安装程序(setup.exe)。

      如果你选择了缺省的典型安装,所有的MySQL文件将会安装到c:/mysql目录下。

      现在,跟着以下步骤,每一步都要执行正确。

      进行一些测试:

      首先,你要先运行mysqld-shareware.exe守护程序,它位于c:/mysql/bin下。你可以看到一个dos窗口,并在几秒钟后关闭。如果没有显示错误信息,MySQLd就已经运行了。

      如果想检查一下MySQL,只要运行c:/mysql/bin/mysql。你将会看到有"mysql>"提示符的终端窗口。很好,我们可以同MySQL服务器进行对话了。

    第二部分 -- 创建和操纵一个MySQL数据库:

      首先我们需要创建要使用的数据库和表。数据库起名为"example",表名为"tbl",有以下字段:识别号,名,姓和信息。要通过mysql终端完成建库和定义表的工作,只要双击或运行c:/mysql/bin/mysql.exe。

      如果要看在MySQL中已经定义了哪些表,可以使用(注意mysql>是终端提示符):

    Mysql> show databases; <回车>

      这个命令可能显示如下信息:

    +----------+
    | Database |
    +----------+
    | mysql |
    | test |
    +----------+
    2 rows in set (0.01 sec)

      为了定义一个新的数据库(example),键入:

    Mysql> create database example; <回车>

      你将会看到一个回答,如:

    Query OK, 1 row affected (0.17 sec)

      很发,我们现在有了一个新数据库了。现在我们可以在库中建立一个新表,但首先我们需要先选中新的数据库:

    Mysql> use example; <回车>

      回答应该是:

    Database changed

      现在我们可以建表了,有如下字段:

      索引号 - 整数
      用户名 - 最大长度为30的字符串
      用户姓 - 最大长度为50的字符串
      自由信息 - 最大长度为100的字符串

      在MySQL提示符下键入下面的命令来创建表:

    MySQL> create table tbl (idx integer(3), UserName varchar(30), LastName varchar(50), FreeText varchar(100));<回车>

      回答应该是:

    Query OK, 0 rows affected (0.01 sec)

      好,让我们看一下从MySQL提示符下看表是什么样子的,键入命令:

    MySQL> show columns from tbl; <回车>

      我们将得到下面的结果:

    +----------+--------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +----------+--------------+------+-----+---------+-------+
    | idx | int(3) | YES | | NULL | |
    | UserName | varchar(30) | YES | | NULL | |
    | LastName | varchar(50) | YES | | NULL | |
    | FreeText | varchar(100) | YES | | NULL | |
    +----------+--------------+------+-----+---------+-------+
    4 rows in set (0.00 sec)

      在这里,我们可以看到刚创建的表"tbl"的内容。

      现在让我们看一下表中有什么内容。键入下面的命令:

    MySQL> select * from tbl;<回车>

      这个命令是用来显示表"tbl"中的所有数据的。输出可能是:

    Empty set (0.07 sec)

      之所以得到这个结果,是因为我们还没有在表中插入任何数据。让我们往表中插入一些数据,键入:

    MySQL> insert into tbl values (1,'Rafi','Ton','Just a test');<回车>
    Query OK, 1 row affected (0.04 sec)

      如上所见,我们插入到表中的值是按照前面我们定义表的顺序,因为使用的是缺省的顺序。我们可以设
    定数据的顺序,语法如下:

    MySQL> insert into tbl (idx,UserName,LastName,FreeText) values (1,'Rafi','Ton','Just a test');<回车>

      好,现在我们可以再看一下表中的内容:

    MySQL> select * from tbl;<回车>

      这次的结果是:

    +------+----------+----------+-------------+
    | idx | UserName | LastName | FreeText |
    +------+----------+----------+-------------+
    | 1 | Rafi | Ton | Just a test |
    +------+----------+----------+-------------+
    1 row in set (0.00 sec)

      现在我们可以看到表的结构和每一个单元格的内容。

      现在我们想删除数据。为了实现我们应该键入:

    MySQL> delete from tbl where idx=1 limit 1;<回车> Query OK, 1 row affected (0.00 sec)

       好,给出一些解释。我们正在告诉MySQL从"tbl"表中删除记录,删除那些idx字段值为1的记录,并且
    只限制删除一条记录。如果我们不限制删除记录数为1,那么所有idx为1的记录都将被删除(在这个例子中我们只有一条记录,但是虽然如此,我只是想让这一点更加清楚)。

      不幸的是,我们又一次得到了一个空表,所以让我们再输进去:

    MySQL> insert into tbl values (1,'Rafi','Ton','Just a test');<回车>
    Query OK, 1 row affected (0.04 sec)

      另一件可以做的事是,修改指定字段的内容,使用"update"命令:

    MySQL>update tbl set UserName='Berber' where UserName='Rafi';<回车>
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

      这个命令将搜索所有UserName为"Rafi"的记录,并将它改为"Berber"。注意,set部分和where部分不一定要一样。我们可以索搜一个字段但是改变另一个字段。而且,我们可以执行两个或更多条件的搜索。

    MySQL>update tbl set UserName='Rafi' where UserName='Berber' and LastName='Ton';<回车>
    Query OK, 1 row affected (0.04 sec)

      这个查询搜索了两个字段,改变了UserName的值。

    第三部分 - 组合PHP与MySQL

      在这个部分里,我们将建立一个建单的基于PHP的web站点,用来控制前面所建的MySQL的表。

      我们将建立下面的站点结构(假设你已经知道一些基本的HTML的知识):

      1. index.php3 用于前端查看表
      2. add.php3 用于往表中插入数据
      3. Modify.php3 用于修改表中的记录
      4. del.php3 用于删除表中的记录

      首先,我们想查看一下数据库:

      看一下下面的脚本。

    --------------------------------------------------------------------------------
    Index.php3:

    <html>
    <head><title>Web Database Sample Index</title>
    </head>
    <body bgcolor=#ffffff>
    <h2>Data from tbl</h2>

    <?
    mysql_connect() or die ("Problem connecting to DataBase");
    $query = "select * from tbl";
    $result = mysql_db_query("example", $query);

    if ($result) {
    echo "Found these entries in the database:<br><p></p>";
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Domain Name</td>
    <td align=center bgcolor=#00FFFF>Request Date</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $text = $r["FreeText"];

    echo "<tr>
    <td>$idx</td>
    <td>$user</td>
    <td>$last</td>
    <td>$text</td>
    </tr>";
    }
    echo "</table>";
    }
    else
    {
    echo "No data.";
    }

    mysql_free_result($result);
    include ('links.x');
    ?>

    </body>
    </html>--------------------------------------------------------------------------------
      好,下面给出一些说明:

      我们先用正常的html标签创建thml文档。当我们想从html中出来转入PHP中时,我们用<?来打开PHP部分,这个告诉web服务器将后面的文本看成是PHP语法而不是一般的html。使用?>来结束PHP部分。

      mysql_connect() 命令告诉PHP建立一个与MySQL服务器的连接。如果连接建立成功,脚本将继续,如果不成功,则打印出die命令的信息“Problem connecting to Database”(如果要看关于mysql_connect的更多的信息和其它的PHP函数,可以去http://www.php.net下的文档中查找)。

      现在,如果MySQL是按照我们上面所讨论的那样安装的,就足够了。但是如果你使用的是预装的MySQL(象ISP),你应该使用下面的命令:

    mysql_connect (localhost, username, password);

      我们可以将$query设成我们想在MySQL中执行的查询,然后使用mysql_db_query命令来执行它:

    $result = mysql_db_query("example", $query);

      这时,"example"表示数据库的名字并且$query是要进行的查询。

      我们使用MySQL命令select(象上面所描述的)来从表中取得所有的数据:

    $query = "select * from tbl";

      简单地解释一下$result的作用,如果执行成功,函数将返回一个查询结果的一个MySQL结果标识符,如果出错则返回false。返回的不是结果而是一个标识符,可以在后面将它转换成我们所需的信息。

      现在,我们想检查一下在数据库中是否存在有记录,并且如果有则将结果按照html的表格结构打印出来。

      为了检查是否存在数据,我们使用if命令和下面的语法:

    if (argument) {
    "do something;"
    } else {
    "do something different;"
    }

      这时"do something"当argument=true时你所要执行的命令,"do something different"为当argument = false时所要执行的命令。

      注意我们使用echo命令来输出一些html标签来建立html的表格结构。只有从PHP命令输出的文本才会被
    看成html内容 - PHP命令本身是不会看成html内容的。

      我们使用的另一个命令是while指令,使用格式如下:

    while (argument)) {
    "something to do";
    }

      while循环在argument=true时会不停地重复,执行在{}中的指令集。

      这里我们组合了while循环和PHP函数$r=mysql_fetch_array($result)。这个函数根据相应的结果标识
    符取回一条记录,并且将结果放在一个相关数组(associative array)$r中,它使用字段的名字作为数组的
    键值。在我们的脚本中,我们将得到一个数组:$r['idx'],$r['UserName'],$r['LastName']和
    $r['FreeText']。

      我们也可以使用mysql_fetch_row函数,它会将结果放在一个有序的数组中,我们可以使用$r[0],$r[1],$r[2]和$r[3]来得到相应的值。

      要了解关于这些函数的更深入的信息请访问http://www.php.net。

      现在,我们有了所有的信息,我们可以把它在html表格中打印出来:

    echo "<tr>
    <td>$idx</td>
    <td>$user</td>
    <td>$last</td>
    <td>$text</td>
    </tr>";

      现在我们可以释放MySQL连接,并且释放一些资源,通过使用mysql_free_result($result)函数。

      PHP另一个有用的特性是在脚本中包括文本文件的功能。让我们假设你有一些可重用的代码(例如到其
    它页面的链接),我们可以使用include函数,这样可以节省一些代码和时间。而且,如果想改变这些代码,
    我们只需要改变包含文件的内容,它将会在所有包括它的文件中生效。

      这里我们创建一个名为Links.x的文本文件,它将存放我们想用在每一个页面中的全部链接菜单。

    <p></p>
    <ul>
    <li><a href="index.php3">Home</a>
    <li><a href="add.php3">Add a new entry to the DataBase</a>
    <li><a href="edit.php3">Edit an entry</a>
    <li><a href="del.php3">Delete an entry from the DataBase</a>
    </ul>

      include的语法是:

    Include ('included_text_file');

      现在我们可以用?>来关闭PHP部分,并且用</body></html>来结束html页面。

      使用表单增加数据

      让我们看一下下面的代码:

    --------------------------------------------------------------------------------
    <html>
    <head><title>Add an entry to the database</title>
    </head>
    <body bgcolor=#ffffff>

    <h1>Add an entry</h1>

    <form method="post" action="add2tbl.php3">
    <table width=90% align=center>

    <tr><td>Index:</td><td><input type=text name="idx" size=3 maxlength=3></td></tr>

    <tr><td>UserName:</td><td><input type=text name="UserName" size=40
    maxlength=100></td></tr>

    <tr><td>LastName:</td><td><input type=text name="LastName" size=40
    maxlength=100></td></tr>

    <tr><td>FreeText:</td><td><input type=text name="FreeText" s=40 maxlength=100></td></tr>

    <tr><td></td><td><input type=submit value=add></td></tr>

    </form>
    </table>

    <?php include ('links.x');?>

    </body>
    </html>
    --------------------------------------------------------------------------------
      假设你对表单很熟悉,这是一个相当简单的脚本。我们根据html页面设计了一个表单,它在提交后调用
    add2tbl.php3脚本。现在,表单与MySQL表相对应由4个字段组成:index number,FirstName,LastName和FreeText。注意在这个表单中字段名字与MySQL表中字段名一样,但这只是为了方便起见而不是必须。

      我们再一次使用了include命令<? include ('links.x');?>(象在前面所解释的)来增加链接。

      让我们看一下add2tbl.php3脚本:

    --------------------------------------------------------------------------------
    <html>
    <body>

    <?
    if ($UserName)
    {
    mysql_connect() or die ("Problem connecting to DataBase");
    $query = "insert into tbl values ('$idx','$UserName','$LastName','$FreeText')";
    $result = mysql_db_query("example", $query);

    echo "Data inserted. new table:<br><p></p>";
    $query = "SELECT * FROM tbl";
    $result = mysql_db_query("example", $query);

    if ($result)
    {
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00FFFF>idx</td>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Free Text</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $free = $r["FreeText"];

    echo "<tr>
    <td>$idx</td>
    <td>$user</td>
    <td>$last</td>
    <td>$free</td>
    </tr>";

    } // while循环结束
    echo "</table>";
    }
    else
    {
    echo "No data.";
    } // if结束($result)
    }
    else
    {
    echo "No UserName Entered. Please go back and reenter UserName";
    } // if结束($UserName)

    echo "<p></p>";

    include ('links.x');

    ?>

    </body>
    </html>--------------------------------------------------------------------------------
    解释:

      这一部分包含两个主要部分。第一部分从前一个表单中得到数据,并将它们插入到数据库中。第二部分
    从数据库中打印出表的内容。第二部分同我在查看数据库部分中所演示的一样。

      第一部分:

      首先我们象通常一样使用mysql_connect()来同数据库连接。

      然后我们使用下面查询:

    $query = "insert into tbl values ('$idx','$','$LastName','$FreeText')";

      这个查询使用从前面表单传递过来的$idx,$UserName,$LastName和$FreeTExt变量,并将它们插入到tbl表中。

      注意,我在脚本中所作的注释。使用一个注释可以用"//",服务器将忽略此行的后面部分。

      简单,不是吗?

      从数据库中编辑一条记录:

      让我们假设一下,我们想修改数据库中存在的记录。在前面,我们看到有一个叫set的SQL命令用来设置数据库中存在字段的值。我们将使用这个命令来修改数据库中的整条记录。

      考虑下面的脚本:
    --------------------------------------------------------------------------------
    edit.php3:

    <html>
    <head><title>Editing an entry from the database</title>
    </head>

    <body bgcolor=#ffffff>
    <h1>Edit an entry</h1

    <?

    mysql_connect() or die ("Problem connecting to DataBase");
    $query = "select * from tbl";
    $result = mysql_db_query("example", $query);

    if ($result)
    {
    echo "Found these entries in the database:<br>";
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00ffff>idx</td>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Free Text</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $text = $r["FreeText"];

    echo "<tr>
    <td align=center>
    <a href=/"editing.php3?idx=$idx&user=$user&last=$last&text=$text/">$idx</a></td>
    <td>$user</td>
    <td>$last</td>
    <td>$text</td>
    </tr>";

    }
    echo "</table>";
    }
    else
    {
    echo "No data.";
    }

    mysql_free_result($result);
    include ('links.x');

    ?>

    </body>
    </html>--------------------------------------------------------------------------------
      如你所见,这里的代码有些熟悉。第一部分只是打印出数据库中表的内容。注意,有一行不太一样:

    <a href=/"editing.php3?idx=$idx&user=$user&last=$last&text=$text/">$idx</a>

      这一行建立了一个到editing.php3的一个链接,并且给新的脚本传递了一些变量。同表单方式很象,只
    是使用的是链接。我们将信息转换成:变量和值。注意,为了打印出 " 符号,我们需要使用 /"否则服务器
    将把它看成PHP脚本的一部分并且作为被打印的信息。

      我们想将数据库中的记录全部转换到过,这样我们就可以得到表中的确切的数据,以便我们修改它容易
    一些。

    --------------------------------------------------------------------------------
    Editing.php3:

    <html>
    <head><title>Editing an entry</title>
    </head>

    <body bgcolor=#ffffff>
    <h1>Editing an entry</h1>
    <form method="post" action="editdb.php3">

    <table width=90% align=center>

    <tr><td>idx:</td><td><?php echo "$idx";?></td></tr>

    <tr><td>UserName:</td><td><input type=text name=UserName size=40 maxlength=100
    value="<?php echo "$user";?>"></td></tr>

    <tr><td>LastName:</td><td><input type=text name=LastName size=40 maxlength=100
    value="<?php echo "$last";?>"></td></tr>

    <tr><td>Free Text:</td><td><input type=text name=FreeText size=40 maxlength=100
    value="<?php echo "$text";?>"></td></tr>

    <tr><td></td><td><input type=submit value="Edit it!"></td></tr></table>

    <input type=hidden name=idx value="<?php echo "$idx";?>">

    </form>

    <?php include ('links.x');?>
    </body>
    </html>--------------------------------------------------------------------------------
      好,这个脚本很简单。我们要关心的是,当表单打印出来时,它记录了当前记录的数据,通过在 <input
    type= > 命令中的value属性。这些数据是从前一个页面传递过来的。

      现在,如果我们不改变记录的信息,它将传回当前值,即缺省值。如果我们改变了字段的值,字段的值
    将变成新的值。接着我们可以将新值传给另一个脚本,它将会改变MySQL表中的值。

    --------------------------------------------------------------------------------
    editdb.php3:

    <?php

    mysql_connect() or die ("Problem connecting to DataBase");

    $query = "update tbl set
    idx='$idx',UserName='$UserName',LastName='$LastName',FreeText='$FreeText' where
    idx='$idx'";

    $result = mysql_db_query("example", $query);
    $query = "SELECT * FROM tbl";
    $result = mysql_db_query("example", $query);

    if ($result)
    {
    echo "Found these entries in the database:<br><p></p>";
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00FFFF>idx</td>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Free Text</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $text = $r["FreeText"];

    echo "<tr>
    <td>$idx</td>
    <td>$user</td>
    <td>$last</td>
    <td>$text</td>
    </tr>";

    }
    echo "</table>";
    }
    else
    {
    echo "No data.";
    }

    mysql_free_result($result);

    include ('links.x');

    ?>--------------------------------------------------------------------------------
      基本上要关心的一件事情是下面一行:

    $query = "update tbl set idx='$idx',UserName='$UserName',LastName='$LastName',FreeText='$FreeText' where idx='$idx'";

      注意,它与我们在前面MySQL部分解释的语法相同。另一件事,注意这个脚本改变的是idx=$idx的记录, 如果表中有多条idx等于$idx的记录,所以这些记录都将被改变。如果我们想更严格一些,我们可以象下面改动一下where子句:

    $query = "update tbl set idx='$idx',UserName='$UserName', LastName='$LastName',FreeText='$FreeText' where idx='$idx' and UserName='$UserName' and LastName='$LastName' and FreeText='$FreeText'";

      这个语法将检查所有的字段,而不仅仅是检查idx。

      从数据库中删除一条记录:

      好,删除很容易。我们仍然需要两个脚本:一个用来选择要删除的记录(基本上同上面选择要编辑的记录一样),一个用来真正地进行删除和打印新的表格。

    --------------------------------------------------------------------------------
    del.php3:

    <html>
    <head><title>Deleting an entry from the database</title>
    </head>

    <body bgcolor=#ffffff>
    <h1>Del an entry</h1>

    <?

    mysql_connect() or die ("Problem connecting to DataBase");
    $query = "select * from tbl";
    $result = mysql_db_query("example", $query);

    if ($result)
    {
    echo "Found these entries in the database:<br><p></p>";
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00ffff>idx</td>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Free Text</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $text = $r["FreeText"];

    echo "<tr>
    <td align=center>
    <a href=/"dele.php3?
    idx=$idx&UserName=$user&LastName=$last&FreeText=$text/">$idx</a></td>
    <td>$user</td>
    <td>$last</td>
    <td>$dtext</td>
    </tr>";

    }
    echo "</table>";
    }
    else
    {
    echo "No data.";
    }

    mysql_free_result($result);
    include ('links.x');

    ?>

    </body>
    </html>
    --------------------------------------------------------------------------------
      这个脚本与我们用过的编辑脚本很象,所以可以看一下那里的说明。

    --------------------------------------------------------------------------------
    dele.php3:

    <?php

    mysql_connect() or die ("Problem connecting to DataBase");
    $query = "delete from tbl where idx='$idx' and UserName='$UserName' and
    LastName='$LastName' and FreeText='$FreeText'";

    $result = mysql_db_query("example", $query);
    $query = "SELECT * FROM tbl";
    $result = mysql_db_query("example", $query);

    if ($result)
    {
    echo "Found these entries in the database:<br><p></p>";
    echo "<table width=90% align=center border=1><tr>
    <td align=center bgcolor=#00FFFF>idx</td>
    <td align=center bgcolor=#00FFFF>User Name</td>
    <td align=center bgcolor=#00FFFF>Last Name</td>
    <td align=center bgcolor=#00FFFF>Free Text</td>
    </tr>";

    while ($r = mysql_fetch_array($result))
    {
    $idx = $r["idx"];
    $user = $r["UserName"];
    $last = $r["LastName"];
    $text = $r["FreeText"];

    echo "<tr>
    <td>$idx</td>
    <td>$user</td>
    <td>$last</td>
    <td>$text</td>
    </tr>";

    }
    echo "</table>";
    }
    else
    {
    echo "No data.";
    }

    mysql_free_result($result);

    include ('links.x');

    ?>--------------------------------------------------------------------------------
      这个脚本看上去很熟悉,唯一不同的就是删除查询的语法:

    $query = "delete from tbl where idx='$idx' and UserName='$UserName' and LastName='$LastName' and FreeText='$FreeText'";

      这个查询将会删除所有与前面的脚本传递来的信息相配匹的记录。容易吧。

      好了,这就是全部内容了。

    返回 Top

    21、河南网站建设技术规划方案
    一、前  言
    为了优化资源配置,集中优势,形成合力,做大做强河南重点新闻网站,根据中央关于建设重点新闻网站的指示精神,经省委、省政府领导同意,由省委宣传部牵头,联合河南日报报业集团、省广播电影电视局、省新闻出版局,共同建设一个实力雄厚、功能齐全、技术先进的省级重点新闻网站——中国河南网。
    “中国河南网”作为代表河南的重点新闻网站,是继河南日报、河南人民广播电台、河南电视台之后的第四家省属新闻媒体。其规划建设坚持党管新闻舆论的原则,确保网站作为党和政府“喉舌”的性质;通过必要的行政和市场手段,整合所有省级新闻媒体的力量,以扩大信息量,增强影响力,为全面建设小康社会,实现中原崛起创造更为有利的网上舆论环境。
    “中国河南网”将整合省直主要新闻单位的新闻资源和网络资源,形成资金、品牌和新闻资源优势;整合各省辖市外宣资源和媒体新闻资源,为各省辖市外宣和报纸、电台、电视台上网搭建平台,并组织各省辖市新闻、外宣信息通过“中国河南网”上网;积极组织政府及各部门的公开信息在“中国河南网”上网,以增加信息量,提高权威性,打造网上河南。
    “中国河南网”的规划建设按照“统一规划,科学论证,分期实施,滚动发展”的原则,努力建成一个简便实用,相对领先,安全可靠,经济合理,易用易管,又可持续发展的网络传播平台,并发展为河南第一、国内一流的区域性综合新闻门户网站,使之成为具有较大社会影响、较强竞争实力的新兴媒体,并使之成为信息传播的新载体,思想政治工作的新阵地,对外宣传的新渠道,最终打造成一个大型网络传媒集团和产业集团。


     
    二、网站的功能设计
     
    (一)网站内容管理和信息发布
    网站的内容,包括文字、图片、视频、音频、各种文档等,通过发布系统进行统一的管理、制作、审核、发布。
    对发布系统的要求,强调内容的有效管理和及时发布,侧重于信息流程的采编一体化。具体要求为:
    1.      采用基于模板的静态信息发布,发布系统采用B/S结构,使用数据库管理所有的内容,所有需要发布的页面均使用模板生成,可方便、灵活地定制、管理模板,模板制作可视化。
    2.      实现跨互联网的多站点、多模板的动态信息静态发布和动态JSP程序的发布,网站速度快,能适应大访问量;可以同时实现非结构化和结构化信息的动态发布。
    3.      系统能够适应采编流程,人员分工明确。
    4.      有明确的权限及权限组的概念,可方便定制人员或组权限,权限限制严格,使不同工作性质的人员只能在被授权的范围内发布信息。
    5.      自动排版,支持内容自动分页,内容表现形式要多样化,可方便、灵活地定制模版。支持多种网页形式。支持多语种,支持发布预览。
    6.      具备强大的发布管理功能,包括文章管理,专题管理,连载管理,编校审流程管理等。新闻发布要求简便快捷,并有对已发新闻快捷方便实现修改、删除、重定向等功能。实现新闻评论。
    7.      具备稿件审批功能,实现现实中严格的审批制度。支持多级新闻发布处理,下属机构可以有独立的新闻发布权,定期或不定期提交新闻内容,经过网站管理员确认后发布。
    8.      新闻跨栏目发布;支持文档关联;具备主题新闻、专题新闻、相关新闻、连载支持;可在页面上指定重大新闻的位置并可固定相关新闻。
    9.      可处理各种信息的来源、管理和发布,包括文字、图片、音频、视频以及其他数据。
    10.  可视化编辑,操作简单,使用方便;网站改版容易,便于信息的深加工利用。可远程发布及家庭办公,稳定且易维护。运营成本低。
    11.  具备全文搜索功能,可以从日期、栏目属性、涉及人物、来源、事件属性等多种角度搜索。其中全文检索功能可以根据一个或多个关键字的“与”、“非”和“或”的关系查询,显示信息时将信息中的关键字标红。
    12.  用户的信息管理及监控管理,具备用户身份验证及对用户在论坛、聊天室、留言板、新闻评论区等所发表的信息进行统一监控管理的功能。
    13.  广告管理功能,实现对站内广告的投放位置、投放时间、投放频率的自动管理,提供对广告浏览频率和点击的统计功能。
    14.  投票、评分系统,可自动的在网站上生成所需要的调查问卷,页面自动生成,可通过IP地址限制过多重复的问卷填写,保证数据合理、精确并能自动进行数据统计、分析,自动生成饼状、柱状图等。
    15.  编辑工作量、栏目文章量及WEB访问量的统计。提供对具体工作人员、具体栏目、栏目内容及单位时间段内的信息处理量的统计数据,并可方便统计单位时间内各级栏目/页面的访问人数、访问者的来路分析(由哪个网站转来)等等。
    16.  确保人员访问安全管理。确保工作人员只能接触到系统的工作界面,无法深入系统底层获取FTP密码,同时所有被授权的用户情况都可以列出详细资料,确保没有匿名用户使用系统,信息发布审批流程确保不会有未审批的信息被发布。
    17.  确保系统运行安全。系统自动备份,安全可靠,数据恢复简单。发布系统应提供日志记录和备份功能,任何对系统的修改都会被记录,一旦系统意外出错,维护人员可以依靠操作日志迅速找到问题所在,并在系统崩溃时能迅速使用备份恢复,保证系统的正常运转。
    18.  能够和论坛、聊天室等其他系统进行关联。
    19.  实现多级别会员管理。会员根据级别(高级、中级、初级)享有不同权限,网站管理员能在后台对会员进行升、降级、删除等操作。不同级别的会员,访问阅读不同级别的新闻内容。  
    20.  多级别新闻内容和发布权限管理。新闻信息的内容具有分级功能,根据内容的发布范围(如会员制、公开制或收费级别等),由网站超级用户决定发布级别、修改、删除等管理操作;发布权限管理可实现内部预发布和最终发布管理。
    21.  个性化的新闻邮件订阅功能:实现可管理方式(如收费制)的每日动态新闻定向推送发寄服务。实现读者的个性化新闻定制服务。
    22.  支持日常发布计划与及时发布,即对不同的栏目指定发布的开始时间,以及对指定栏目立即进行发布。能进行发布进程监控,支持多种发布方式,支持增量发布、重新发布等。
    23.  文章预排序:指定某一栏目下的文章在不同的时间的排列顺序。
    24.  栏目管理:栏目管理功能用于维护整个网站目录树。对栏目可以有移动、合并和复制操作。支持多级子栏目。
    25.  作者管理:作者不是网站的内部员工,属于网站的撰稿人,由网站管理员将作者的基本信息入库。作者可以在远程凭借用户名和密码进入发表系统,直接录入他们的文章,然后网站编辑可以直接编辑、审核这些文章。发布系统中的其他部分对作者来说不可见也是不可进入的。实现稿费管理,操作者能一次性审核一批文章的稿费。
     
    (二)站点资料检索
    对结构化和非结构化信息(如Web页面、新闻、专利、法律、项目文档、合同、技术文档、科技文献、图书目录等)建立全文检索,实现方便快速的查找、排序、管理等功能。具体要求:
    1.      查询速度快,可靠、稳定。
    2.      搜索结果样式由模板控制,可自订检索结果页面。支持按标题、作者、日期、全文等搜索有关内容。包括:标题搜索、关键词搜索、作者名称搜索、时间段搜索、全文搜索、文章分类搜索、在结果集中再搜索等。同时支持模糊检索、分类检索、日期检索、 包含检索、专题检索、 历史检索等多种检索方式。
    3.      支持检索结果多种排序方式,按相关条件顺序或逆序等。
    4.      实现智能化高查准率、查全率:支持字索引、词索引、关键词索引、字词混合索引,实现以自然语言处理技术为核心内容的智能中文分词技术,以及基于知识词典的扩展检索功能,支持同音查询,容错查询,同义字查询等。
    5.      查询手段丰富,支持各种逻辑运算(如AND、OR、NOT等)、关系运算、字段查询、多种复杂条件查询,支持模糊查询,支持日期型数据的范围查询,支持西文检索和中西文混合检索、词频运算和按时间或相关性(重要性)排序,等等。
    6.      支持对多种文件格式内容搜索,包括word、Excel、 PowerPoint等 Office文件格式,以及 TEXT、HTML、PDF、RTF、电子邮件等常用文件格式。也可对 SQL Server、Oracle、Access、Informix、Sybase等数据库进行字段资料全文检索的功能。
    7.      多平台、多语言支持,支持简体中文、繁体中文、外国文字和Unicode等,并能够在不同的编码之间转换。
    8.      具安全管控功能,编辑人员按照各自不同的权限对信息进行管理。
    9.      可监控指定目录和数据库表是否更新,
    支持自动增量更新索引
    10.  支持本地文件上传,用户可以将本地的单个文件上传并加载到远程检索服务器的系统索引当中。
     
    (三)分类搜索
    面向用户提供网站信息的在线查询。功能要求:
    1.      具备上述站点资料检索的所有特点,如:查询速度快,高查准率、查全率,查询手段丰富,管理能力强,高可靠性、稳定性,占用硬盘资源、内存资源小,多平台、多语言支持,高可扩展性、开放性,等等。
    2.      可进行目录式搜索,每个目录内又可设搜索区,可在目录中再搜索一次。
    3.      支持高交互性、个性化,允许用户定制自己的个性化搜索需求、允许用户参与网站评价,可遵循严格的质量评价体系(基于内容和基于链接的智能化分析)向用户给出网站、网页相关度星级级别。 
     
    (四)自动信息收集
    实现对外部网站及其他来源的信息进行采集整理。具体功能如下:
    1.      可下载指定的公开免费信息(可以是html等静态网页或asp、php、jsp及Java Script等动态网页)以及收费加密的(用户具备合法取得信息的权限)信息(可以是html等静态网页或asp、php、jsp及Java Script等动态网页),加密下载支持多种认证方式,如域认证、页面认证等等。
    2.      用户可以自定义每个信息源的标示、起始地址、抓取信息地址格式、抓取信息类型、抓取区域、抓取深度、关键字、优先级、启停时间、模板等参数,并具备完善的信息源管理功能,可方便地实现网站信息源的增、删、改、查等操作。
    3.      对信息源信息搜索的过程可以动态监控,可以直接浏览下载的文档。要保证对全球网页进行大容量页面数据获取和更新的同时,可以对被获取的页面内容进行相关内容的筛选,剔除不在需求范围内的数据冗余,以保障获取数据尽可能与所需要的数据一致。
    4.      支持多种类型信息的获取,不仅可以采集普通的静态和动态网页信息,而且可以采集zip、mp3、avi、rar、mov、pdf、jpg、gif等各种不同类型的信息。
    5.      支持对任意字段的复杂组合检索;支持二次检索(即渐进检索);支持中英文混合检索; 支持智能化模糊检索;检索结果与站点抓取同步一致,实现对信息源的实时监控。
    6.      可定制模板,指定只下载模板指定的部分,如标题、时间、正文、URL等等,自动过滤无用的广告、栏目、版权等信息,同一信息源下还可设置多个不同的下载模板。也可以不设模板,自动分析下载,下载内容包括标题、正文、来源、时间等。也可以下载指定的文件格式,下载的信息可以通过关键词过滤,关键字支持与、或、非的逻辑组合,同时,系统还应提供完善的关键字管理。
    7.      可进行信息重复下载控制,对指定页面的位置、时间、内容等条件可智能化信息分析,防止信息的重复下载。
    8.      可以通过代理服务器进行下载,可以设置下载时间,自动下载,可以任意定制结果样式,下载的信息可以生成多种标准的文件格式。
    9.      对下载信息进行有效管理,系统下载的信息可以根据用户的设置进行分类,也可以由系统自动分类,要求自动分类的准确率高。可对下载信息进行编排,提取关键词、摘要等。下载的信息要方便查询,可直接导出到其他存储设备上,可以导出为是文件格式,也可以为数据库表格式。采集来的数据可按指定格式分字段存入数据库相应位置,实现与其他应用程序的接口。可实现自动采集,自动生成网站栏目和频道,无需人员值守。
    10.  下载速度快。
     
    (五)信息订阅
    网站信息可通过新闻邮件、短信等方式订阅,按照需求随时向订阅者发送新闻、杂志、公告等信息。基本功能为:
    1.      用户可创建多个邮件订阅组;可方便地构建自己的邮件订阅,支持信息分类的邮件列表。
    2.      订阅者能方便的订阅和取消订阅。按时间段和地域统计订阅者人数,并给出统计图表。
    3.      内容支持Text或HTML格式,同时可以发送附件。
    4.      管理员可以网上进行发送邮件、更改密码、成员导入、删除等操作。
    5.      允许有多个管理员,成员管理时知道已确认者与未确认者。
    6.      管理员可以对成员进行分类管理、发送,能够自动取消。
    7.      管理员可以根据需要随时方便地建立新的邮件组,邮件组可与网站上栏目、专题等形成一一对应的关系。自动完成邮件组内邮件来源的设置,可以进行邮件组模板的设置。
    8.      可对邮件进行编辑,支持所见即所得的邮件编辑及邮件模板编辑,自动生成邮件,可以随时预览生成的邮件。邮件信息来源可由系统自动生成或由编辑者自己选择。
    9.      允许社区成员直接订阅,实现对订阅用户的认证及收费管理。
     
    (六)网上调查与在线信息反馈
    通过开展网上问卷调查,迅速了解社会不同层次、不同行业的人员需求,客观地收集需求信息,从而更好地改善服务,同时也吸引更多的长期用户群。系统要求:
    1.      运行稳定、操作简单、调查的问题不受限制,支持同时开展多个调查。
    2.      界面友善,操作方便。可方便设置调查表版面及调查结果样式,调查结果能以多种方式显示,如表、饼图、条状图等。支持调查关联、组合调查等多种调查风格。
    3.      支持单选、多选、自填等多种投票机制;支持调查界面嵌入、弹开等多种模式。
    4.      可设定每个调查问题的属性,包括:是否自填答案、是否需要多行填写、此问题是否允许,问题跳转等。能满足最复杂的调研需要。
    5.      采用所见即所得方式建立和修改调查表,调查结果自动生成,自动统计总的投票数,自动计算各调查项百分比等。
    6.      可防止重复投选,保证调查结果准确度。
    7.      支持调查项目创建,编辑,删除,用户验证等操作。
    8.      整个调查活动的组织、管理、发布都可实现远程操作。
    9.      答卷可自动收集、汇总到服务器端数据库。
    10.  支持问卷调查管理,实现网站问卷调查内容的更新与维护,提供在后台输入、查询、修改、删除调查问卷(问卷类别、问卷内容、问卷答案、问卷状态等),通过修改问卷状态来确定该问卷是否在网站显示;支持问卷搜索管理,用户根据任意条件可以查找问卷并回答问卷。
    11.  支持结果Email定时发送到指定邮箱,以及分类、统计、查询等。
    12.  可提供意见发表,允许用户发表对问卷内容的见解。
     
    (七)文章评论
    对文章或新闻等发表评论,评论原文对所有用户开放,用户可以发表个人意见或查看别人的发言。具体功能要求:
    1.      实时提交,用户可以实时发表个人意见或查看别人的发言。
    2.      评论表现方式多样,既可在文章下面显示文章评论列表,亦可在讨论区进行讨论,支持合并多个相关新闻文章的评论内容。
    3.      可以进行用户评论信息的动态管理和分类管理。网站管理人员可以即时看到所有的评论,并对所有评论进行内容管理,删除不良言论,回复用户的疑问等。可实现评论发表前的审核控制。
    4.      开放结构,可实现与其他有关系统无缝对接。
    5.      自动反馈,对所有反馈意见可以自动生成回复信函,自动记录用户的邮件地址,为提供后续客户服务创造条件。
    6.      支持分页,对反馈意见进行分页管理,方便浏览。
    7.      评论信息可归类整理,可以对反馈意见按主题词进行检索,整个系统流程要有序、合理,要便于访问。
    8.      可实现评论用户与虚拟社区会员统一管理。
     
    (八)音视频点播和网上直播
    网上音视频点播和直播,突破了传统电视按事先安排的程序播放节目、观众被动观看节目的局限,最大限度地让观众实时观看到高质量的节目。
    1.      点播功能如下:
    1)      播放画面流畅,可实现平滑、无停顿和无抖动地欣赏视频节目,可综合传输文字、图片、声音和视频信息。
    2)      查询方法简便快捷,数据更新快捷;具有快速的响应速度;多媒体信息展示界面简洁明了、切合实际需要。
    3)      管理简便、操作方便,通过“节目管理”可对系统中的节目信息进行维护和管理。提供视频节目单管理,可响应用户的点播请求以及用户在点播过程中的交互。
    4)      支持多种协议;自动搜索视频服务器和视频节目表单,采用多级索引结构,用户能够迅速查找喜爱的节目;并支持加入在线广告。
    5)      可实时进行音视频流的解压,对从远端接收的音视频流不需任何预读便可完全动态解压。
    2.      直播功能包括:
    1)      可将摄像头拍摄的实况信息,电视台播放的节目,录像机、VCD机和DVD机的视频和音频输出,计算机屏幕,VCD、DVD节目等各种不同的实况音视频源进行实况直播。
    2)      音视频全实时同步:全实时同步视音频采集、压缩、存储、网络传输、播放,不丢帧,可放大至全屏。
    3)      支持文件直播,字幕及图片的显示与管理,支持多频道选择,支持远程直播,并支持跨广域网直播。
    4)      可以定时录制、定时直播、定时停止,真正做到无人值守管理。
    5)      支持客户端无限的级联,支持客户端多频道选择。
    3.      其他功能:
    1)      提供用户分组及权限设置功能,对客户等级进行有效管理,提供完整的计费、身份认证功能等。
    2)      实现社区用户直接点播、观看、计费管理。
    3)      可对系统使用情况进行全面的监控,并具备完整的数据库修复、备份、日志处理等功能。
    4)      具有完整的点播频道管理、广播频道管理和客户管理,具备良好的管理界面;服务端可以完全不需要人员值守,可自动进行记费、统计等工作。可随意添加、删除或修改目录、视频节目;实现多级目录索引,可轻松管理视频节目,可打开、保存、修改不同的节目表单;实现实时状态显示,能够随时反映出各个节目的播放状态,点播人数等。
    5)      具备开放式的自由讨论空间。
     
    (九)资料软件类下载
    提供大量热门的资料及软件的下载,主要特点是:方便检索,快速下载。具体要求为:
    1.      具备良好的管理功能,实现资料的多目录分类管理,上传、修改、删除资料方便快捷,具备友好的管理界面。实现管理员分级权限管理。
    2.      实现资料软件的多站点下载,支持多用户多线程同时下载,速度可优化到最快。
    3.      可用多种方式进行资料软件的查找检索,如目录查找,关键字搜索,目录中再搜索以及结果中再搜索等。
    4.      提供用户分组及权限设置功能,对客户等级进行有效管理,提供完整的计费、身份认证功能等。实现用户下载计费管理。
    5.      具备开放式的自由讨论空间。
     
    (十)广告管理与发布
    实现广告的投放管理,对站内广告的投放位置、投放时间、投放频率等实现自动管理,并提供对广告浏览频率和点击按年、月、日、时进行统计的功能。具体功能包括:
    1.      实现对管理人员、广告客户的权限管理,包括用户的创建、修改、删除,授予权限、变更权限、分类等功能。并实现对广告投放的直接计费管理。
    2.      实现对广告的方便管理功能,包括广告定位、投放比例、投放位置、发布基数、开始及截止日期等管理功能,并实现广告项目的新增、修改、删除等功能以及实现广告的分组管理等。
    3.      可自动生成广告代码功能,并可根据浏览器的类型显示相应代码。
    4.      可多种方式生成广告报表,并可以多种方式统计显示广告的投放计划、时间安排、形式等信息。
    5.      可准确快速进行数据统计分析,可将广告实际投放的时间、形式等信息以报表和图例等方式显示出来,可根据访问者的来路,将其按地域进行汇总;可将广告的访问情况如显示数目、点击数、点击率等相关信息按照年、月、日、时、分进行汇总;可以按用户、时间段、广告项目等等条件,生成各种统计报表及图示。
    6.      可对广告进行方便查询,如按日期查询一个时间段内的广告案例投放及点击等情况;按广告投放形式查询满足此投放形式的广告案例;可以选择区域查询该地域内网友所访问的广告案例的相关情况等等;并可将以上几种查询条件组合起来进行查询。
     
    (十一)工作量统计
    统计单一工作人员或具体团队的工作量大小,来衡量具体工作人员的工作量和工作成效。统计分析功能可分为几个部分:编辑工作量统计、栏目文章量统计、网站访问情况统计等。编辑工作量统计可用来了解编辑的工作情况;栏目文章量统计自动统计发布系统栏目里的文章被操作的记录;网站访问情况统计用来统计栏目或文章的受欢迎程度等。在该功能中,要实现统计人员的权限管理,并实现对工作人员及具体团队的完善管理功能。统计结果可以按时间累计或增量统计,统计结果简单明确,并能以多种形式表现出来。
     
    (十二)WEB访问统计及网站流量分析监控
    分析统计WEB访问统计提供网站被访问的整体数据,包括:流量统计、访问量统计、用户统计、页面统计、地区统计、最近访客资料等。可具体分析:
    1.      站点最受欢迎栏目,文章等。
    2.      实时分析文章、栏目、站点的访问量,可以按小时、天、月、年进行对比分析。
    3.      可获得某段时间内、某个栏目或某个区域等条件内的文章访问量、访客来路、URL访问数及区域IP等排行榜。
    4.      可对站点日每小时、周每日、月每日、年每日、年每月进出流量以及访问量、访问成功数等统计报告。
    5.      可实现用户的浏览器、操作系统等信息统计。
    6.      可实现单位时间内站点栏目、页面访问次数统计及相关访问信息分析,如访问人数、访问者的来路(由哪个网站转来)等等。
    7.      可进行访客的地区统计以及各个地区的访问量统计。
    8.      可分析访问者每次访问的访问日期、时间、IP、操作系统、浏览器、来自何方、访问的URL、停留时间等相关信息。
    9.      可查询分析任意时间范围内、某地区的总流量、平均流量、最大流量。
    10.  可分析任意时间范围内、某地区的总访问量、平均访问量、最大访问量。
    11.  要求分析数据做到公平、真实、可靠,查看分析报表方便、快捷,分析报表表现形式直观、多样。
    12.  同时监测各个服务端口;监测某些应用界面;监测系统的带宽使用情况等。
     
      (十三)网站用户认证,收费和管理
    系统采用一次登陆全站访问体系对网站用户加以管理,对不同业务系统的用户登录进行统一认证,包括用户密码、身份及权限的认证,并且根据系统的配置,在认证成功后跳转到相应的系统中去。对所有增值服务计费并统一结算。具体包括:
    1.      用户管理和认证管理
    1)      用户的所有认证过程中的数据均经过加密,确保用户信息不被监听、截获和盗用。
    2)      所有的用户只能登录一次,防止多用户使用一个用户和用户名的盗用。依据管理的方式不同,对用户进行分类管理。可实现用户名挂失及解挂处理。可对用户账号进行锁定或禁止。
    3)      实现以用户组方式管理的功能。一个用户组可以拥有多个用户,一个用户也可以隶属于多个用户组,并可方便实现对用户组的权限授予和解除功能,用户自动具有用户组的权限,且可对单个用户授权。
    4)      用户自己注册,注册成功后可修改、注销自己的信息,并有密码找回功能。管理员可以修改、注销用户的状态和注册信息。用户注册后默认为一般用户组,管理员可以改变用户隶属的用户组或单独更改该用户的权限。
    5)      用户的身份信息、资源信息、角色信息和各种访问策略信息等等可以通过目录服务实现存储、管理和访问等服务功能。为管理员提供高性能查询的服务能力。
    6)      实现用户的分级委托管理,可为管理员分配不同的权限以管理不同组或不同区域的用户。为管理员提供统一的用户身份和资源管理界面。
    7)      对用户提交的注册信息进行分析,将用户的特点归纳出来,实现个性化的服务的提供。
    8)      对不同业务系统的用户登录进行统一认证。包括用户密码、身份及权限的认证,并且根据系统的配置,在认证成功后跳转到相应的系统中去。
    2.      收费系统功能包括:
    1)      提供多种网上支付功能,用户可在网站建立账户,并向自己的账户上注款。
    2)      支持多种方式的计费处理,并根据不同的计费方式,分别计算出费用金额,最后按服务项目分别汇总到用户的结算账目中,并计算用户账目余额。用户相关费用的结算、查询等处理简单、明了。
    3)      管理员及用户可通过收费功能了解付款到账等相关信息。
    4)      每一笔款项数量、时间、操作者、附注等相关信息都有详实可靠的记录,可供查找、核实。
    5)      在到款后可及时向用户发送到款通知,用户可以方便查看所有已经付费的服务项目及付费金额等相关信息。
    6)      支持特权及免费用户,可设立高级用户组及用户权限,使高级用户在不同系统功能中可享受优惠或免费特权服务。
    7)      确保用户网上相关信息的安全。
     
    (十四)虚拟社区:
    1.     
    BBS论坛系统
    论坛是网上社区交流的主要形式,它使人与人的交流不受时间和地点的限制。具体功能包括:
    1)      管理员可以方便管理论坛中的帖子,可设定帖子内容最大允许的字节数等相关信息。可按发言人、主题、内容、时间等信息任意对帖子排序、查询,可以设置精华帖首页显示,置顶某帖等;可方便快捷地在线增删讨论标题,能以图表形式管理讨论组用户。管理员可方便开启、关闭论坛。提供方便的后台管理程序对整个论坛进行管理。
    2)      用户管理安全可靠,用户必须先注册才能参与讨论组;用户可申请版主,由管理员授权,版主管理维护论坛文章,版主可以作版主公告。用户发贴时服务器自动记录用户信息,用户管理由认证、计费、管理系统统一管理。对用户可实现消息管理,提供方便的在线通知、好友管理;设有个人收藏夹,个人收集可以放到网上。用户可以自建主题留言版。用户可以进行个人专辑管理,可设定将各论坛的特定帖子加入到发帖者的个人专辑,发帖者可以对自己的个人专辑进行管理,其他访问者也可以访问任何一个人的个人专辑。实现积分功能。
    3)      可以建立信息共享组,组内的任意一成员向该组的标题发邮件,组内所有成员可同时收到该邮件。允许非组内用户用不同方式订阅该讨论组邮件或取消订阅。
    4)      帖子列表显示,可以树形列表显示帖子层次列表,显示内容包括发表日期,点击数,字节数,回复帖子数等,并以各类图标形式区分不同贴子(新帖、热帖、置顶、重要等)。可定制显示或不显示栏目导航条,帖子列表支持分页显示,具有分页查看工具条。
    5)      显示论坛当前的状态,如注册总人数、当前贴子总数、贴子点击总数、当前在线人数;用户表现积分排行。
    6)      支持丰富的帖子格式,如文本、图片等,提供个人签名功能,并提供大量的表情、头象等图片、图标供用户发帖时选择。
    7)      提供帖子的检索、查询功能,能够按作者、主题等进行查询,同时还可以查询论坛贴子的全文内容、以及贴子附件的内容等。
    8)      能定期自动生成电子期刊,并能够以Email的形式自动发送到会员的电子邮箱中。
    9)      具备完善的安全过滤机制,可完全过滤禁发内容,并可通过安全监控对论坛帖子实行管理,允许定制先审后发。
    2.     
    聊天室系统
    聊天室是提供给网民一个交友与娱乐的场所,在聊天室里网民可选择自已的聊天对象,与其进行对话交流,是网民之间相互沟通、交流情感的最佳方式之一。同时它已成为各网站提供的一个服务标准,是吸引网民,提高人气的一个重要方式。功能要求:
    1)      速度快、稳定性高、占用系统资源少、用户界面友好、功能强大。可同时支持万人以上在线聊天,响应时间短。
    2)      支持TCP/IP及HTTP等各种协议,用户可以透过防火墙进行聊天,可实现多用户多频道,灵活的系统扩充结构和管理功能,并具有友好的用户界面。提供丰富有趣的表情、动作符号,聊天字体可随意设置。 根据需要能以多种方式保存聊天记录。
    3)      用户管理由认证、收费、管理系统统一管理,用户可以选择是否公布自己的个人信息。用户可以将指定用户的谈话内容完全过滤,以有效地防止个别用户的恶意骚扰;用户可以查找指定聊友是否在线,在哪个聊天室等。用户可以随时结束聊天,退出聊天系统。
    4)      提供严格的管理员层次体制,管理员通过相关权限的操作,可以维护聊天室的秩序和聊天室的系统安全,方便实现对聊天室的监控及管理。设置过滤功能,过滤禁发言论。
    5)      具备强大的后台管理功能,主要包括:锁IP、锁用户等;管理人员的管理操作,如踢人、删帖等,都记录在案,用户可以进行申诉,做到聊务公开。
    6)      权限受理灵活、合理,站长可以通过高级管理员维护系统的正常运转。
    7)      具备丰富的聊天功能,包括:私聊窗,悄悄话,嘉宾聊天室,表情动作,用户权限分极,改名,在线人员列表,当前人员列表等。 聊天者可以发送文件、图片给聊天对象。提供语音聊天功能。
    3.        
    其他
    1)     
    贺卡:实现网上贺卡的制作、上传、下载、发送以及定时发送等功能。
    2)     
    同学录:网上同学交互的场所,支持多彩留言,照片上传下载,学校、班级及班级成员的管理等功能。
    3)     
    虚拟城市:网上虚拟的现实社会,虚拟现实生活中的各种场景。
    4)     
    交友中心:交友系统是虚拟社区的重要功能之一。社区成员可以填写自己的相关信息,并上载照片,以备其他社区成员查询。系统为每个社区成员维护一个好友列表。好友之间可以更加方便地沟通和交流。
    5)     
    相册:支持用户管理,相片上传、注释、下载、删除,方便的系统监控管理功能。
    6)     
    留言板:支持个人留言板管理,方便的系统监控管理功能。
     
    (十五)基于web的大容量邮件服务
    为客户提供方便的及时的信息是网络服务的重要功能。E-Mail是Internet应用的非常重要的部分。大容量的邮件服务系统功能包括:
    1.      具有丰富的邮件收发、远程管理、多邮件域等专业邮件系统功能,具备可靠、安全、高速的特点。具备智能垃圾邮件处理功能,对邮件进行病毒过滤。
    2.      具有灵活的扩展性和低廉的系统构建投入。具有庞大用户容量可承载性,支持SMTP/POP3/IMAP等邮件通信协议,并可拓展系列增值服务,可以使用Outlook、Foxmail等邮件客户端进行邮件收发。并且支持WebMail,管理员可以在Web形式下对邮件系统进行管理,用户可以在Web形式下管理自己的邮箱,处理自己的邮件。
    3.      支持超文本邮件的读写,可实现与OUTLOOK同步的地址薄及邮件搜索,方便的管理机制、丰富的报表,以及个性化功能如:自动回复,自动转发,垃圾信拒收,自定义签名,个性化信纸等。
    4.      具备方便的管理功能,支持邮件列表功能,管理员可以创建、修改、删除邮件列表,还可以查询某个用户被列在哪些邮件列表中,邮件列表可以进行访问限制,限定邮件列表中用户的权限。提供多级用户权限管理。可一次性创建批量帐号。
    5.      提供“邮件群发”功能;支持只读邮箱,信箱内信件只能特定人删除修改;支持公告栏;支持错误邮件地址自动转发,收信人不存在的邮件会自动转发给一个已经存在的邮箱;支持邮件自动拷贝,管理层可以查看每封发出的和接收的邮件;支持在WEB界面上的语音邮件和视频邮件。
    6.      具有卓越的安全防护体系。
     
    (十六)短信业务
    短信业务可以向中国移动、中国联通、小灵通和固定电话的用户提供发送短信息、铃声、图片、定制新闻、点播、游戏等服务,为企业用户提供集团短信服务。同时通过该平台可以方便的为第三方内容和应用提供接口。可支持庞大用户容量,处理突发性强,数量庞大的集群信息发送,并可实现针对不同行业、不同应用定制个性化短信系统。
    功能包括:
    1.      支持各种数据(英文、中文、铃声、图片、游戏等)的发送和MO,支持网关的各种计费方式(免费、包月、按条),并可根据网关提供的计费方式进行计费的修改。方便和不同的移动运营商连接。可以分别通过各自SIM卡,连接不同的网络。
    2.      具备调度系统对定时发送的信息进行调度。
    3.      具备网关监控系统,能够自动监控网关是否能够正常工作,如果网关有故障,将其自动恢复。
    4.      方便完善的管理系统,可进行以下管理:
    1)      铃声下载管理、手机屏保管理、手机点歌管理、短信笑话管理、短信祝福管理、用户手机号码管理、收费管理、结算管理等。
    2)      内容合作伙伴管理:内容合作伙伴资格的审核;内容频道的审核、查看、归类。
    3)      频道管理:编辑的添加、删除和授权管理频道;频道内容的更新、修改、删除;发送、订阅、收益日志的查看。
    4)      编辑更新:内容频道的更新、修改、删除。
    5)      MT(网站下发)频道管理:频道的选择、修改、暂停;价格的设定;发送频率的设定等功能。
    6)      用户管理:注册用户的查看、退订、暂停、积分、各类记录、黑名单的管理、帐单查询等功能。

    日志系统:注册、订阅、发送、点播日志。
    7)      用户反馈:用户反馈的处理、用户反馈的接收、用户反馈的查看。
    8)      MO(点播)频道管理:频道的选择、修改、暂停;价格的设定;发送频率的设定等功能。
    5.      为用户提供方便的服务,包括:
    1)      用户可方便地注册、登陆;忘记密码可使用密码找回功能,注册用户可进行帐务查询、个人通讯录管理等。
    2)      可实现与用户认证、收费、管理系统相结合,社区用户可直接登陆使用,对其直接计费,实现多种收费方式。
    3)      用户可以方便地订阅、退订、暂停;可查看订阅频道等。
    4)      用户可以自写短信、定时发送;并且用户可以自写闪烁短信、免提短信等。并可实现语音短信的录制、播放、删除、重录、发送等功能。
    5)      提供及时发送、定时发送、发单个用户、群发、加密服务等功能;发送方用户可查询留言发送状态、查询短信接收状态、转发、重发(转发送模块)等,根据发送方用户的具体喜好及发送需求提供背景音乐、歌曲、日常用语、笑话、节日贺词、其他预购信息(叫醒服务等)及商务需求(商务定时提醒、活动通知、客户联络、水电气催缴、政府公告等公益活动)。
    6)      提供支持各种机型的铃声、图片下载。提供手机点歌、手机屏保、短信笑话、短信祝福、新闻定制、日程提示等功能。
    7)      可实现集团用户的特殊服务,集团用户可通过WEB界面或客户端发送短信、定时发送、管理通讯录等。且集团用户可通过第三方接口在现有系统中嵌入短信的功能。
    6.      提供第三方系统接收和发送短信的接口。提供各种应用模块:如短信一对一系统、竟猜系统、调查系统、短信问答等。
     
    (十七)股票行情
    提供实时股票行情信息。要求: 速度快,实时提供行情信息;提供按股票代码或拼音查询个股行情的功能;提供跟踪多个自选股的实时行情的功能;提供针对所有股票的各类技术分析;提供股票的分时走势和常用的K线图;提供在曲线窗口内用鼠标拖动缩放曲线的功能;并有灵活的系统扩充结构。 能与第三方对接实现网络股票交易功能。
     
    (十八)电子商务应用
    产品宣传、客户管理、供应链和内部运作等全部在线进行,从而实现全面的、集成的、一体化的电子商务。其功能包括:
    1.      产品管理和发布:
    1)      自由定义产品属性,产品种类和数量不限制;
    2)      产品实现分类管理,支持任意级产品分类;
    3)      支持图文可视化编辑,支持多媒体形式展示产品;
    4)      内置产品价格体系,支持多种促销手段;
    5)      支持非产品信息管理和发布;
    6)      内置网店管理,支持电子商厦类应用。
    2.      订单处理
    1)      购物推车支持,在线定购;
    2)      支持订单分解、组合、修改、确认;
    3)      批量发货、退货处理;
    4)      在线支付处理;结算处理;
    5)      订单跟踪处理;
    6)      多种销售报表支持。
    3.      物流配送
    1)      仓储系统:支持出库、入库操作;
    2)      加工系统:加工、发货处理;
    3)      运输系统:收货、发货、运输跟踪;
    4)      物流中心:结算处理,统计分析和报表。
    4.      自动化流程
    1)      自由定义和配置业务处理流程,支持业务流程重组;
    2)      内置流程引擎,支持动态配置和监控。
    5.      客户服务
    1)      客户可以浏览商品信息、查看商品详细信息、显示商品信息的查看量、该商品的人气值、相关产品推荐、商品点评、消费向导、消费排行榜、新品快递、名优精品、每日推荐;
    2)      可将选中商品加入购物车、加入意向购买箱、加入备忘录、将商品推荐给好友;
    3)      为用户提供产品提醒服务、缺货登记服务、供求信息、退货台、打印功能;
    4)      实现会员积分制、建立会员服务中心、备忘录、信息系统、日历、历次购买物品清单、定时提醒服务、定单追踪、快速购物通道等。
    5)      提供个性化服务,如用户可以定制自己的电子商务页面。
    6)      实现在线的交流功能,增加与客户沟通渠道,客户可以通过网络完成各种产品咨询、反馈与投诉、技术支持、下载服务等功能。
    6.      具备方便完善的后台管理功能,采用严格的身份验证和多级权限管理,各部门的权限分别有的相应帐号,登录后只能使用自己权限范围内的功能模块,对于其他的越权操作将无法进行。管理功能还应包括:
    1)      信息录入及信息发布、页面制作;
    2)      商品查询、定单管理、在线支付、退货管理;
    3)      管理人员的信息交换、管理人员的协调工作;
    4)      库存管理、代理商支持系统、供求信息发布、缺货信息登记;
    5)      安全认证、个性化服务管理、日志分析等。
     
    (十九)电子政务
    政府对公众和企业信息服务和政务服务的入口,通过电子政务,一方面,政府可以为公众和企业提供及时、丰富的政务信息,提供公众和企业所需要的政务服务;另一方面,公众和企业可以随时随地查阅政府的各种政策信息,享受政府的各种服务,包括各种申报等。
    1.      收、发文的管理 
    1)      完成文件、公文的上传下达,包括收文登记、发文登记、创建、拟稿、登记、核稿、会签、签发、分发、归档等等。
    2)      实现收发文创建、浏览、统计、查询及处理等各种功能。
    3)      收、发文管理方便、灵活。根据各单位实际情况定义出不同的公文流程。可方便地配置各流转步骤的使用权限,对公文流转步骤进行增减,确保公文流转的实用性、安全性。
    4)      根据不同用户组织的体系结构,规划相应的公文流转类型及流转步骤。对不同规模的企、事业单位,按照层次结构定义及配置相关发文类型,还可对各部门进行级别控制,如各处室的收发文等。
    5)      可以按实际情况灵活配置公文的文头、标题线、文号模式、简称等文件信息,能够对不同类型不同级别的文件进行自动编号。归档文件自动生成档案条目,实现文档一体化。
    6)      流程跟踪。对每一文件流转都自动作详细的记录,写在跟踪日志中。
    7)      全文检索和多条件的模糊查询。
    8)      文件的提醒、待办与催办。可通过电子邮件方式实现。
    9)      实现邮件的跟踪、签名、加密以及回执等功能,提供验证、存取控制、字段级加密和电子签名等安全措施。
    2.      会议管理
    1)      包括会议室管理、会议室预定、会议流程、会议通知、领导日程安排和会议纪要、会议统计和查询等功能。
    2)      可根据具体情况确定会议室管理员、会议通知发送人等不同角色的人员。
    3)      提供会议室的使用申请、审批功能。通过提交预定申请,让领导和管理员及时了解会议室的实际情况。
    4)      对会议室占用时间等进行监控,来合理地安排、分配、管理会议室。
    5)      拥有相应权限的人员,可以发送会议通知,可以电子邮件、短信等方式提醒有关人员,并作为日程安排项目自动添加到接受人的个人日历中。有关人员可方便及时对通知作出答复,通知人可方便、快速地浏览通知答复情况,方便实现会议的取消与变更。
    6)      实现会议纪要的录入、发送、按权限查询功能。可对会议进行多种方式的查询、统计、浏览。
    3.      文书档案管理
    1)      提供管理形式多样、格式各异的文件管理功能。
    2)      可灵活、多样、动态地配置信息类别,把围绕一个或多个主题的所有相关信息(文本、图形、声音、影像、Web页面、OFFICE文档、多媒体课件等)集成在一起,使用户通过简单清晰的界面快速、方便地查询某一主题的信息。
    3)      在公文管理、档案、会议、出差申请、采购申请等系统的流程结束时,可自动将处理结果和内容进行归档,实现文档一体化。
    4)      提供严格的管理权限控制,保证数据的安全性、保密性。
    4.      电子公告和电子论坛
    模拟单位的公告栏与布告栏的功能,进行公告的发布。根据各部门的实际情况设置发布审批流程,公告内容包括不同级别的紧急程度标识,同时,用户可直接引入、转发已成文的公告。工作人员可通过电子论坛进行讨论。
    5.      实现政府信息的存储、整理、发布、查询,以及网上办公等功能。
     
    (二十)远程教学
    远程教学即利用网络作为载体,实现分布式教学。它不受时间、空间和地域的限制,从而实现了自主学习。远程教学主要包括以下功能:
    1.      教育资源制作、管理、发布,提供教育资源编辑、制作工具;支持素材库、课件库、题库、案例库、课程库等。
    2.      教学管理
    1)      学习系统
    a.      答疑/讨论,在线交流。
    b.      音视频资源下载/学习。
    c.      课件学习,课件内容按章节分层组织。
    d.      可针对不同的学习组、不同的教学内容进行组播;支持交互式教学,各教学点可根据需要灵活选择教学模式。
    e.      作业:作业按章节组织,题目类型多样化;支持在线、离线答题。
    f.      自测:学生自己生成测试题目;使用教师生成的测试题目;可预约考试。
    g.      成绩查询,学习统计。
    2)      教学评价系统
    3)      授课系统
    a.         学务管理:提供远程报名、选课、选购教材、答疑等网络自动管理功能。
    b.      教师指导:为授课教师进行教学咨询和个性化教育提供的查询功能。包括学生情况、课件内容、学生作业、教学计划、教学任务查询等。
    c.      章节管理:设置每个课程的章节结构。
    d.      资源管理:兼容多种资源类型。
    e.      作业管理:提供作业的新增、编辑、发布、批改和统计。
    f.      题库管理:提供多种题型的处理。
    4)      系统管理
    a.      招生管理:招生计划管理、考生信息管理、划线录取。
    b.      学籍管理,教学计划,课程管理。
    c.      选课管理:选课预约设置、选课缴费确认、查询。
    d.      考试管理:考试预约、缓考申请、成绩录入、调整学分。
    e.      毕业管理:毕业审核、毕业证书管理。
    f.      用户管理:用户组管理、用户组权限设置、用户管理。
    g.         教务管理:学籍、教师、专业、教材、作业、考试、教育证书管理等。
    h.      财务管理:记录、查询、统计和提示学费支付情况。
    5)      社区系统
    u  校友录,教师录,好友列表,修改密码,网站导航,评价教师,评价学生,学员录。
     
    (廿一)网络会议
    实时交互式语音通讯平台,提供语音、文本等的实时通讯服务。实现基于互联网的异地音视频会议及语音交流和文字交流。可实现:
    1.      在任何地点方便地展开跨地区会议。
    2.      可通过建立不同的会议室来开展分组讨论。
    3.      实时管理会议室和与会人员。
    4.      录制会议过程,作为会议备忘或参考以及提供给不能参加实时会议的人员共享。
     
    (廿二)网络游戏
    提供在线网络游戏服务。网络游戏有很多种,像Web平台的江湖社区游戏(著名的有第九城市:
    www.the9.com、可乐吧:
    www.kele8.net 等);客户端网络游戏(传奇、石器时代、红月、帝国在线、反恐精英等等),它们都具有投资少、见效快、服务单纯等特点。
     
    (廿三)大样反解及生成版面图、PDF版
    可发布报纸电子版,功能包括:
    1.      反解大样(*.S2、*.S72、*.PS2、*.PS)文件及其附图。自动生成指定格式文件,可对图片进行压缩。并且还可生成版面图和PDF。可一次反解一个或一批大样文件。
    2.      能显示大样的版式,用户可直接在版面上进行合并、连接、分离、删除等工作。如对每一篇文章进行标引时,标引项的内容可以直接键入,也可从文章中摘取,还可以从事先作好的标准表中选择。
    3.      支持手动、自动等多种反解方式。程序能自动抽取所有文章的标题,日期版次等版面特征也能自动提取,可自动识别作者。对版面分布情况进行智能分析,连接被分成多块(例如标题和内容)的文章。反解后的文章可直接放到指定位置。
    4.      支持多种库结构,每个库可有独立的标引字段和输出路径。
     
    (廿四)ChinaCache CDN网络加速
    通过放置在各地的高速缓存服务器和智能控制系统,实现智能流量负载均衡,把网站的内容发布到离用户最近的地方,使用户能够就近访问位于各个地方网站上的内容,从而充分发挥用户接入的带宽,用户感觉就像是在上局域网一样。
    通过ChinaCache CDN 系统的智能动态负载均衡技术,可以将用户的请求就近定向到系统的一个节点服务器上。高性能的节点服务器则进一步保证了Internet用户的访问能得到更及时可靠的响应。同时, CDN服务提供商,通过软件刷新功能,将自动保障各个节点服务器与ICP网站的原服务器的数据同步,使得用户能够随时访问ChinaCache CDN 的各节点服务器并得到与原服务器完全相同的内容。
     
    (廿五)其他服务:域名服务,服务器空间租用,主机托管服务等。


     
    三、网站建设原则
     
    (一)         
    先进性

        采用当今流行、且是未来发展方向的技术。
     
    (二)         
    可靠性

        全面采用最新的稳定的技术及构架,保证系统设计的安全可靠。能够解决各种导致网络系统失效的意外情况,保证网站各项业务在7x24小时内不间断运行。
     
    (三)         
    实用性

        充分考虑当前的不同业务层次,各环节管理中数据处理的安全性和便利性,把满足基本业务需求作为第一要素进行考虑。
     
    (四)         
    安全性
       
    提供从系统级安全到应用层安全的各级防护措施,最大限度地防止非法入侵和操作,保证数据安全。确保信息是有效的、安全的,信息在传输过程中不会被篡改、丢失、乱序,信息不会被随意生成、修改和删除;进行交易的人具有可靠的标识;一旦遇安全问题,数据能迅速恢复。
     
    (五)         
    伸缩性
       
    系统架构灵活,全部采用模块化设计,可以轻松进行各个模块之间的组合,系统可以方便的多次扩充。
     
    (六)         
    扩展性
       
    从网络协议到操作系统,从系统软件到应用软件,均遵循通用的国际或行业标准,可以很轻松地和其他系统对接,并可方便地进行二次开发与改造。
     
    (七)         
    易用性

        基于B/S 体系结构。充分考虑操作者的特点,采用人性化设计,方便易用。
     
    (八)         
    管理性

        一个容易管理的系统不但可大大降低系统管理员的负担,而且能够在系统发生任何问题的时候都能够很容易地进行诊断,并采取有效措施,确保系统处在良好运行的状态。
     
    (九)         
    集成性
       
    能与多种专业Web应用相集成。
     
    (十)         
    标准化

        遵循目前国内、国际和行业标准,主要包括:
    《GB/T 9361-1988 计算机场地安全要求》;
    《GB17859-1999 计算机信息系统安全及维护等级划分准则》;
    《RFC1829 专用加密机制》;
    《GB/T 1527-1994 信息处理、数据加密、物理层互操作要求》;
    等等。
     
    四、网站架构
     
    (一)系统架构分析
    采用先进的三层体系结构,在Browser/Server三层体系结构下,表示层(Presentatioon)、功能层(Business Logic)、数据层(Data Service)被分成三个相对独立的单元。
     
    (二)软件架构说明:
    1.      内容管理及发布系统信息来源于信息采集系统、大样反解系统及生成版面图、PDF版、股票信息系统及供下载的资料软件等。
    2.      电子政务、电子商务、短信系统、远程教学、音视频点播直播的相关信息发布通过发布系统发布到WEB服务器上,并通过用户认证、计费系统进行管理,同时和邮件系统、虚拟社区系统等相关联。
    3.      邮件系统、网络会议、网络游戏等均通过用户认证、计费系统进行管理,并和虚拟社区系统等相关联。
    4.      网络会议、远程教学、视频点播直播系统关系紧密,网络会议可通过远程教学实现,视频点播直播是实现网上视频教学的工具。
    5.      信息订阅、文章评论、网站调查均与发布系统相关,通过通过用户认证、计费系统进行管理,并和虚拟社区系统等相关联。信息订阅可能过电子邮件系统、短信系统等实现。
    6.      搜索引擎、工作量统计、网站流量分析直接通过应用服务器实现,并可直接对数据库服务器中数据进行查询统计。
    7.      广告发布系统渗透于各个模块。
    8.    所有应用都通过各自的应用服务器来实现,应用服务器与数据库服务器相连。
     
    (三)
    硬件总体架构图:
     
       
    (四)硬件系统设计要求
    1.      高性能全交换,光纤接入,采用千兆以太网技术,满足大负荷网络运行需求;
    2.      采用服务器集群系统,负载均衡,节点可扩展;
    3.      支持二/三/四层交换,按需划分网络,保证全网无阻塞,基于浏览器和一些网络管理工具的图形化配置,便于日常管理和维护;
    4.      多媒体应用,包括视频点播、视频会议、远程教育需求;
    5.      强大安全和稳定特性,抭灾难能力,采用专用软硬件防火墙产品,提高网络安全与性能,支持大数据量访问;
    6.      高性价比产品,支持系统平滑升级;
    7.      良好的冗余备份机制,一旦出现故障,可以快速恢复。
     
    (五)网络安全性分析
    如果网站的安全得不到保障,入侵者就很容易利用系统的漏洞、配置的不当,进行破坏活动。如数据被有意篡改、页面被丑化或者修改,如贴上谣言、黄色图片或反动言论;修改客户的资料或个人资料;入侵者还有可能通过嗅察器(SNIFFER)、木马等入侵方法获取用户的帐号、密码等敏感信息等,可能造成极其恶劣的影响和严重后果。
     
    (六)网络安全设计要求
    1.      服务器管理区和办公区配备高性能的硬件防火墙,制定不同的过滤和安全策略,保护服务器群和办公用机的安全。
    2.      配备入侵监测系统,对来自网络内部和外部的入侵企图,进行报警、响应、防范。并对网络的运行进行监控、记录、重放。
    3.      在各电脑主机上安装分布式防病毒软件,针对文件、E-mail、网络等新型病毒有效查杀,对各主机集中进行病毒库更新、管理和控制。
    4.      在邮件服务器前端加装邮件防毒网关,保证邮件服务器中邮件库的数据安全,并可以拦截垃圾邮件。
    5.      安全服务人员要不断对服务器主机进行安全加固的服务工作,给主机操作系统打补丁、去除多余服务等,加固操作系统的安全,确保主机的服务器安全。定期用安全扫描软件对所有的服务器和防火墙进行扫描,检查漏洞等等。
    6.      良好的数据备份机制,一旦出现安全问题,可以迅速恢复。

     
    五、需购置的硬件设备及软件系统
     
    功能
    设备
    网站内容管理发布系统
     
    发布服务器 2 台
    同步服务器 1 台
    应用服务器 1 台
    大型数据库服务器 2 台
    音视频文件服务器 2 台
    磁盘阵列 1 台
    Web服务器 3 台
    邮件系统
    认证服务器 1 台
    邮件服务器 2 台
    邮件磁盘阵列 1 台
    磁带机 1 台
    流媒体编辑及点播、直播系统
    流媒体采编系统服务器 2 台
    音视频媒体采编系统服务器 2 台
    音视频流媒体管理服务器 1 台
    音视频管理服务器 1 台
    磁带机 2 台
    音视频磁盘阵列 1 台
    音频点播和直播设备
    视频点播和直播设备
    摄像机
    非线性编辑机
    网站用户认证、收费和管理系统
     
    用户认证服务器1台
    收费服务器1台
    管理服务器 1 台
    同步服务器 1 台
    磁带机 1台
    磁盘阵列 1 台
    虚拟社区系统
    虚拟社区系统服务器 1 台
    应用服务器 1 台
    大型数据库服务器2 台
    磁带机 1 台
    短信业务系统
    短信平台服务器 1 台
    应用服务器 1 台
    大型数据库服务器2 台
    磁带机 1 台
    电子政务系统
    应用服务器 2 台
    同步服务器 1 台
    大型数据库服务器2 台
    磁带机 1 台
    远程教育系统
    应用服务器 2 台
    同步服务器 1 台
    大型数据库服务器2 台
    磁带机 1 台
    网络会议系统
    应用服务器 1 台
    同步服务器 1 台
    大型数据库服务器2 台
    磁带机 1 台
    网络游戏系统
    应用服务器 2 台
    同步服务器 1 台
    大型数据库服务器 2 台
    磁带机 1 台
    软件系统
    网站各应用软件系统
    操作系统
    数据库系统
    内部办公系统
    网络防病毒系统
    其他设备:
    负载均衡器 2 台
    域名解析等服务器 3 台
    储存系统 1套
    交换机  6台
    路由器  2台
    硬件防火墙  2台
    入侵检测系统  1套
     
     
     
     
     
     
     
    六、实施步骤:
     
    1、布线:装修时,根据硬件架构进行内部网络布线。
    2、软硬件安装调试:根据网站建设方案购进相应的硬件设备及软件系统,进行软硬件的安装调试,并进行测试。
    3、内容建设:根据内容规划方案设计栏目、页面、模板等,并进行基本信息内容的填充。
    4、试运行:按各项规章及工作流程进行试运行,及时发现软硬件等各方面的问题,并进行改进。
    5、网站正式开通。

    返回 Top

    22、网站首页的设计

    设计首页的第一步是设计版面布局。

    就象传统的报刊杂志编辑一样,我们将网页看作一张报纸,一本杂志来进行排版布局。
    虽然动态网页技术的发展使得我们开始趋向于学习场景编剧,但是固定的网页版面设计基础
    依然是必须学习和掌握的。它们的基本原理是共通的,你可以领会要点,举一反三。

    版面指的是浏览器看到的完整的一个页面(可以包含框架和层)。因为每个人的显示器
    分辨率不同,所以同一个页面的大小可能出现640*480像素,800*600像素,1024*768像素等不
    同尺寸。

    布局,就是以最适合浏览的方式将图片和文字排放在页面的不同位置。
    你可能注意到:“最适合”是一个不确定的形容词,什么才是最适合的呢?抱歉的是
    阿捷不能也不可能给您一个完整的正确的答案。就好比有人希望知道成功的秘诀是什么,
    成功者只能建议您用什么方法,什么途径才能最容易获得成功,而不可能有一步成功的
    "秘诀"告诉您。

    我们在设计思考系列文章第四篇讲过站点整体的创意,版面布局也是一个创意的问题,
    但要比站点整体的创意容易,有规律的多。让我们先来了解一下版面布局的步骤:

    一.草案

    新建页面就象一张白纸,没有任何表格,框架和约定俗成的东西,你可以尽可能的发挥
    你的想象力,将你想到的"景象"画上去(我们建议您用一张白纸和一支铅笔,当然用作图
    软件photoshop等也可以)。这属于创造阶段,不讲究细腻工整,不必考虑细节功能,只以
    粗陋的线条勾画出创意的轮廓即可。尽你的可能多画几张,最后选定一个满意的作为继续
    创作的脚本。

    二.粗略布局

    在草案的基础上,将你确定需要放置的功能模块安排到页面上。(注:功能模块我们在
    "首页设计-引子"中提过,主要包含网站标志,主菜单,新闻,搜索,友情链接,广告条,邮件列表,
    计数器,版权信息等)。注意,这里我们必须遵循突出重点、平衡谐调的原则,将网站标
    志,主菜单等最重要的模块放在最显眼,最突出的位置,然后在考虑次要模块的排放。

    三.定案

    将粗略布局精细化,具体化。(靠你的智慧和经验,旁敲侧击多方联想,才能作出具
    有创意的布局。)

    在布局过程中,我们可以遵循的原则有:

    1、正常平衡---亦称"匀称"。多指左右、上下对照形式,主要强调秩序,能达到安定
    诚实、信赖的效果。
    2、异常平衡---即非对照形式,但也要平衡和韵律,当然都是不均整的,此种布局能
    达到强调性、不安性、高注目性的效果。
    3、对比---所谓对比,不仅利用色彩、色调等技巧来作表现,在内容上也可涉及古与
    今、新与旧、贫与富等对比。
    4、凝视---所谓凝视是利用页面中人物视线,使浏览者仿照跟随的心理,以达到注视
    页面的效果,一般多用明星凝视状。
    5、空白---空白有两种作用,一方面对其他网站表示突出卓越,另一方面也表示网页品
    位的优越感,这种表现方法对体显网页的格调十分有效。
    6、尽量用图片解说---此法对不能用语言说服、或用语言无法表达的情感,特别有效。
    图片解说的内容,可以传达给浏览者的更多的心理因素。

    以上的设计原则,虽然枯燥,但是我们如果能领会并活用到页面布局里,效果就大不
    一样了。比如,
    ○网页的白色背景太虚,则可以加些色快;
    ○版面零散,可以用线条和符号串联;
    ○左面文字过多,右面则可以插一张图片保持平衡;
    ○表格太规矩,可以改用导角试试。
    经过不断的尝试和推敲,你的网页一定会亮丽起来的哦:)

    看看我们经常用到的版面布局形式:

    1."T"结构布局。所谓"T"结构。就是指页面顶部为横条网站标志+广告条,下方左面为主菜单,
    右面显示内容的布局,因为菜单条背景教深,整体效果类似英文字母"T",所以我们称之为"T"形布
    局。这是网页设计中用的最广返的一种布局方式。(图略)
    这种布局的优点是页面结构清晰,主次分明。是初学者最容易上手的布局方法。缺点是规矩
    呆板,如果细节色彩上不注意,很容易让人"看之无味"。

    2."口"型布局。这是一个象形的说法,就是页面一般上下各有一个广告条,左面是主菜单,
    右面放友情连接等,中间是主要内容。(图略)
    这种布局的优点是充分利用版面,信息量大(我的主页首页即属于这种布局)。缺点是页面拥挤,
    不够灵活。也有将四边空出,只用中间的窗口型设计,例如网易壁纸站。

    3."三"型布局。这种布局多用于国外站点,国内用的不多。特点是页面上横向两条色块,将
    页面整体分割为四部分,色块中大多放广告条。

    4.对称对比布局。顾名思义,采取左右或者上下对称的布局,一半深色,一半浅色,一般用于
    设计型站点。优点是视觉冲击力强,缺点是将两部分有机的结合比较困难。

    5.POP布局。POP引自广告术语,就是指页面布局象一张宣传海报,以一张精美图片作为页面
    的设计中心。常用于时尚类站点,比如ELLE.com。优点显而易见:漂亮吸引人。缺点就是速度慢。
    作为版面布局还是值得借鉴的。

    以上总结了目前网络上常见的布局,其实还有许许多多别具一格的布局,关键在于你的创意和
    设计了。对于版面布局的技巧,这里提供四个建议,您可以自己推敲:

    1.加强视觉效果
    2.加强文案的可视度和可读性
    3.统一感的视觉
    4.新鲜和个性是布局的最高境界

    返回 Top

    23、《成功项目管理训练营》深圳

    课程背景:
    为加强企业内部项目管理的计划、控制和有效执行,同时在执行层增强项目计划和控制能力,在操作层增强项目管理工具和技术的操作能力。本课程是在与多名中,美,日企业人士和管理咨询专家讨论的基础上,针对企业向项目式管理体制转化和项目管理能力提高设计的深度、全面的课程。在实用性上包含作者在多年项目管理工作中累积的实际案例和归纳了部分跨国集团公司在项目管理方面成功的方法,在创造性上提出了项目控制的时间分布模型及应用,具有很强的务实性和可操作性。

    课程特点:
    $ 生动的图片教学模式
    $ 多年的项目管理实际经验
    $ 采用大量的实际案例阐释
    $ 先进的项目管理技术和方法
    $ 完整的学习与结构训练

    课程对象:
    总经理、副总经理、项目总监、项目经理、项目策划工程师、项目组成员、项目工程师和其他项目辅助成员

    课程时间:2 天

    授课大纲:

    1.项目管理简介
    1.1项目管理的历史 1.2项目管的兴起
    1.3项目管发展的基础 1.4传统企业的新战略
    1.5企业的离散性与整合性 1.6项目的统计分析
    1.7国际项目管理的现状 1.8国内项目管理的现状
    1.9项目管理的发展趋势

    2.目管理基础知识
    2.1企业战略规划 2.2 企业战略规划与项目
    2.3项目的定义与特征 2.4项目管理的定义
    2.5目的生命期 2.6项目与项目外部环境关系
    2.7企业组织对项目的影响

    3.项目管理基础知识
    3.1项目管理过程组 3.2启动过程组
    2.3计划过程组 3.4计划实施过程组
    3.5控制过程组 3.6结束过程组

    4.项目管理知识领域
    4.1项目综合管理 4.2案例分析:铱星计划、堤内堤外、管道
    4.3项目范围管理 4.4范围管理案例:“巨人”的变、工作描述的应用
    4.5项目费用管理 4.6费用管理案例:“天天”的费用
    4.7项目时间管理 4.8时间管理案例:捷足先登
    4.9项目质量管理 4.10质量管理案例:祸福相依
    4.11项目采购管理 4.12采购管理案例:采购的“祸”源
    4.13项目沟通管理 4.14沟通管理案例:通关的困难
    4.15项目风险管理 4.16风险管理案例:药业的风险
    4.17项目人力资源管理 4.18人力资源管理案例:项目团队形式

    5.项目组织技术
    5.1项目组织形式 5.2职能型组织机构
    5.3项目型组织机构 5.4项目团队机构
    5.5组织中的软技术 5.6案例:张科长的迷茫

    6.项目日程计划技术
    6.1项目计划过程 6.2工作分解机构(WBS)
    6.3持续时间估计 6.4持续时间的蒙特卡罗仿真
    6.5网络图与逻辑甘特图 6.6关键路径法CPM
    6.7逻辑关系设定 6.8二次扫描
    6.9时差与关键路径 6.10计划评审技术PERT

    7.项目资源配置技术
    7.1资源需求变化曲线 7.2资源数量预测
    7.3单作业资源配置 7.4单资源作业配置
    7.5资源负荷图 7.6资源均衡技术
    7.7资源费率估计

    8.项目控制技术
    8.1项目控制技术 8.2项目控制基准
    8.3过程控制系统模型 8.4项目状态测量与报告
    8.5费用控制技术 8.6时间与费用综合管理
    8.7挣值法的基本参数 8.8挣值法的差异参数
    8.9挣值法的预测参数 8.10挣值度量方法
    8.11挣值法的应用案例

    9.关键链与时间箱理论简介
    9.1约束理论TOC与关键链 9.2约束理论在项目管理中的应用

    10 .案例分析

    返回 Top

    24、Java安全通信、数字证书及数字证书应用实践

    Abnerchai(柴政) 2004年6月

    在本文中,我用详细的语言和大量的图片及完整的程序源码向你展示了在 JAVA中如何实现通过消息摘要、消息验证码达到安全通信、以及用Java的工具生成数字证书,和用程序给数字证书签名、以及用签名后的数学证书签名applet突破applet的访问权限的过程,给出了全部例子的详细代码。

    通过本文中你可以学到以下知识:

    •  程序间如何安全通信

    •  什么是 及 如何生成消息摘要

    •  什么是 及 如何生成消息验证码

    •  如何使用 Java工具生成和维护数字证书库

    •  如何用程序给数字证书验证签名

    •  如何利用数字证书给 applet签名突破applet的访问权限

    关键字:

    消息摘要、消息验证码、指纹、加密、安全、 Java、数字签名、applet、数字证书

    一、基础知识

    计算机安全通信过程中,常使用消息摘要和消息验证码来保证传输的数据未曾被第三方修改。

    消息摘要是对原始数据按照一定算法进行计算得到的结果,它主要检测原始数据是否被修改过。消息摘要与加密不同,加密是对原始数据进行变换,可以从变换后的数据中获得原始数据,而消息摘要是从原始数据中获得一部分信息,它比原始数据少得多,因此消息摘要可以看作是原始数据的指纹。

    例:下面一段程序计算一段字符串的消息摘要

    package com.messagedigest;

    import java.security.*;

    public class DigestPass {

    public static void main(String[] args) throws Exception{

    String str="Hello,I sent to you 80 yuan.";

    MessageDigest md = MessageDigest.getInstance("MD5");//常用的有MD5,SHA算法等

    md.update(str.getBytes("UTF-8"));//传入原始字串

    byte[] re = md.digest();//计算消息摘要放入byte数组中

    //下面把消息摘要转换为字符串

    String result = "";

    for(int i=0;i<re.length;i++){

    result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);

    }

    System.out.println(result);

    }

    }

    当我们有时需要对一个文件加密时,以上方式不再适用。

    又例:下面一段程序计算从输入(出)流中计算消息摘要。

    package com.messagedigest;

    import java.io.*;

    import java.security.*;

    public class DigestInput {

    public static void main(String[] args) throws Exception{

    String fileName = "test.txt";

    MessageDigest md = MessageDigest.getInstance("MD5");

    FileInputStream fin = new FileInputStream(fileName);

    DigestInputStream din = new DigestInputStream(fin,md);//构造输入流

    //DigestOutputStream dout = new DigestOutputStream(fout,md);

    //使用输入(出)流可以自己控制何时开始和关闭计算摘要

    //也可以不控制,将全过程计算

    //初始时是从开始即开始计算,如我们可以开始时关闭,然后从某一部分开始,如下:

    //din.on(false);

    int b;

    while((b=din.read())!=-1){

    //做一些对文件的处理

    //if(b=='$') din.on(true); //当遇到文件中的符号$时才开始计算

    }

    byte[] re = md.digest();//获得消息摘要

    //下面把消息摘要转换为字符串

    String result = "";

    for(int i=0;i<re.length;i++){

    result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);

    }

    System.out.println(result);

    }

    }

    当 A和B通信时,A将数据传给B时,同时也将数据的消息摘要传给B,B收到后可以用该消息摘要验证A传的消息是否正确。这时会产生问题,即若传递过程中别人修改了数据时,同时也修改了消息摘要。B就无法确认数据是否正确。消息验证码可以解决这一问题。

    使用消息验证码的前提是 A和B双方有一个共同的密钥,这样A可以将数据计算出来的消息摘要加密后发给B,以防止消息摘要被改。由于使用了共同的密钥,所以称为“验证码”。

    例、下面的程序即可利用共同的密钥来计算消息摘要的验证码

    package com.mac;

    import java.io.*;

    import java.security.*;

    import javax.crypto.*;

    import javax.crypto.spec.*;

    public class MyMac {

    public static void main(String[] args) throws Exception{

    //这是一个消息摘要串

    String str="TestString";

    //共同的密钥编码,这个可以通过其它算法计算出来

    byte[] kb={11,105,-119,50,4,-105,16,38,-14,-111,21,-95,70,-15,76,-74,

    67,-88,59,-71,55,-125,104,42};

    //获取共同的密钥

    SecretKeySpec k = new SecretKeySpec(kb,"HMACSHA1");

    //获取Mac对象

    Mac m = Mac.getInstance("HmacMD5");

    m.init(k);

    m.update(str.getBytes("UTF-8"));

    byte[] re = m.doFinal();//生成消息码

    //下面把消息码转换为字符串

    String result = "";

    for(int i=0;i<re.length;i++){

    result += Integer.toHexString((0x000000ff&re[i])|0xffffff00).substring(6);

    }

    System.out.println(result);

    }

    }

    使用以上两种技术可以保证数据没有经过改变,但接收者还无法确定数据是否确实是某个人发来的。尽管消息码可以确定数据是某个有同样密钥的人发来的,但这要求双方具有共享的密钥,若有一组用户共享,我们就无法确定数据的来源了。

    数字签名可以解决这一问题。数字签名利用非对称加密技术,发送者使用私钥加密数据产生的消息摘要(签名),接收者使用发送者的公钥解密消息摘要以验证签名是否是某个人的。由于私钥只有加密者才有,因此如果接收者用某个公钥解密了某个消息摘要,就可以确定这段消息摘要必然是对应的私钥持有者发来的。

    使用数字签名的前提是接收数据者能够确信验证签名时(用发送者的私钥加密消息摘要)所用的公钥确实是某个人的 (因为有可能有人假告公钥)。数字证书可以解决这个问题。

    数字证书含有两部分数据:一部分是对应主体(单位或个人)的信息,另一部分是这个主体所对应的公钥。即数字证书保存了主体和它的公钥的一一对应关系。同样,数字证书也有可能被假造,如何判定数字证书的内容的真实性呢?所以,有效的数字证书必须经过权威 CA的签名,即权威CA验证数字证书的内容的真实性,然后再在数字证书上使用自己的私钥签名(相当于在证书加章确认)。

    这样,当用户收到这样的数字证书后,会用相应的权威 CA的公钥验证该证书的签名(因为权威的CA的公钥在操作系统中己经安装)。根据非对称加密的原理,如果该证书不是权威CA签名的,将不能通过验证,即该证书是不可靠的。

    若通过验证,即可证明此证书含的信息(发信人的公钥和信息)是无误的。于是可以信任该证书,便可以通过该证书内含的公钥来确认数据确实是发送者发来的。

    于是,双方通信时, A把数据的消息摘要用自己的私钥加密(即签名),然后把自己的数字证书和数据及签名后的消息摘要一起发送给B,B处查看A的数字证书,如果A的数字证书是经过权威CA验证可靠的,便信任A,便可使用A的数字证书中附带的A的公钥解密消息摘要(这一过程同时确认了发送数据的人又可以解密消息摘要),然后通过解密后的消息摘要验证数据是否正确无误没被修改。

    利用这一原理,我们可以突破 java的applet小程序在浏览器中的权限,由于默认的applet权限控制不允许它访问操作系统级的一切。于是我们可以用我们数字证书来给applet签名,然后客户端收到该applet时,系统会自动查看给该applet签名的数字证书并提供给终端用户判定是否信认该数字证书,如果用户信认,则该applet便有了访问系统的权限。

    二、 Java中的数字证书的生成及维护方法

    一、前言

    Java中的keytool.exe可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。

    每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。

    在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是:

    CN(Common Name名字与姓氏)

    OU(Organization Unit组织单位名称)

    O(Organization组织名称)

    L(Locality城市或区域名称)

    ST(State州或省份名称)

    C(Country国家名称)

    可以采用交互式让工具提示输入以上信息,也可以采用参数

    -dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"来自动创建。

    二、示例

    如下所示一句采用交互式创建一个证书,指定证书库为 abnerCALib,创建别名为abnerCA的一条证书,它指定用RSA算法生成,

    且指定密钥长度为 1024,证书有效期为3650天:

    C:/j2sdk1.4.1_01/mykeystore>keytool -genkey -alias abnerCA -keyalg RSA -keysize 1024 -keystore abnerCALib -validity 3650

    如下图所示:

    上图中最后一步,我们输入的是 CN,代表中国的缩写,也可以直接输入“中国”两个字。

    三、证书的操作方法

    •  证书的显示

    如:

    keytool –list –keystore abnerCALib

    将显示 abnerCALib证书库的的所有证书列表:如下图示:

    又如: keytool -list -alias abnerCA -keystore abnerCALib

    将显示 abnerCALib证书库中别名为abnerCA的证书的信息。如下图所示:

    又如: keytool -list -v -alias abnerCA -keystore abnerCALib

    将显示证书的详细信息( -v参数)如下图所示:

    •  将证书导出到证书文件

    如: keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib

    将把证书库 abnerCALib中的别名为abnerCA的证书导出到abnerCA.cer证书文件中,

    它包含证书主体的信息及证书的公钥,不包括私钥,可以公开,如下图所示 :

    上面导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,因此不利用公布证书,可以加上 -rfc参数以一种可打印的编者编码输出。

    如:

    keytool -export -alias abnerCA -file abnerCA.cer -keystore abnerCALib -storepass 100200 –rfc

    这个命令在命令行中指定了证书库的访问密码,同时指定以可查看编码的方式输出。

    3、通过证书文件查看证书的信息

    通过命令 :keytool –printcert –file abnerCA.cer可以查看证书文件的信息。

    也可以在 windows中双击产生的证书文件直接查看。

    •  证书条目的删除

    keytool的命令行参数-delete可以删除密钥库中的条目,如:

    keytool -delete -alias abnerCA -keystore abnerCALib

    这条命令将 abnerCALib库中的abnerCA这一条证书删除了。

    •  证书条目口令的修改

    如:

    keytool –keypasswd –alias abnerCA –keystore abnerCALib

    可以以交互的方式修改 abnerCALib证书库中的条目为abnerCA的证书。

    Keytool –keypasswd –alias abnerCA –keypass 123456 –new 200100 –storepass 1002 00 –keystore abnerCALib

    这一行命令以非交互式的方式修改库中别名为 abnerCA的证书的密码为新密码123456,行中的200100是指该条证书的原密码, 1002 00是指证书库的密码。

    三、数字证书的签发(签名)

    我们在上面创建好了数字证书,但这些数字证书还没有经过权威 CA的证实(即签名)。一般情况下,我们需要将这些证书发送给权威的CA,并申请其签名以确认数字证书让客户信任。

    下面我们将模仿自己是一个权威的数字证书认证机构 CA,这个机构将采用自己的私钥来签发其它的证书。这个签发过程是这样的:我们自己是CA,我们自己有一个自签的数字证书存入数字证书库中。在数字证书库中的这个我们的CA数字证书,它含有私钥,公钥和我们这个CA的主体信息。下面这一个指令可以创建一个CA的自签的数字证书:

    keytool –genkey –dname “CN=美森系统软件有限公司,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都市,ST=四川省,C=中国” –alias MissionCA –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

    上面,我们在 abnerCALib这个数字证书库中创建了一个别名为:missionCA、有效期为3650天、算法为RSA且密钥长度为1024的数字证书,这条证书的私钥密码为:200100,证书库的访问密码为:100200。这条别名为missionCA的证书代表我们自己的权威CA即:美森系统软件有限公司这个权威CA。以后我们将用这个证书来签名其它的数字证书。

    现在我要给自己申请一个数字证书,我可以这么做:先在数字证书库中创建一条证书:

    keytool –genkey –dname “CN=柴政,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都市,ST=四川省,C=中国” –alias abnerCA –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

    这样创建了一个别名为 abnerCA的数字证书,我们可以将它导出为cer文件(见前)。

    接着,我们可以用上一步生成的 CA的自签证书来签名我这个数字证书了。

    CA签名数字证书的过程需用以下程序来进行,这个程序是自解释的:

    package com.security;

    import java.io.*;

    import java.security.*;

    import java.security.cert.*;

    import java.util.*;

    import java.math.*;

    import sun.security.x509.*;

    /**

    * <p>Description: 该程序根据签发者(CA)的证书信息(即CA的私钥)来对被签发者

    * 的证书进行签名,过程即是使用CA的证书和被签证书来重构形成一个新的证书</p>

    * @author abnerchai

    * @version 1.0

    */

    public class SignCert {

    public static void main(String[] args) throws Exception{

    char[] storepass = "100200".toCharArray();//存放CA证书和被签证书的证书库的访问密码

    char[] cakeypass = "200100".toCharArray();//CA数字证书条目的访问密码

    String alias = "missionCA";//CA证书在证书库中的别名,这个CA的证书用来签名其它的证书

    String name = "abnerCALib";//存放CA证书和被签证书的证书库的名字

    String newLib = "SignedLib";//新证书库的名字,如果需要将签名后的证书放入新库,这是新库的名字

    char[] newLibPass = "100200".toCharArray();//设置新库的访问密码

    String cerFileName = "abnerCA.cer";//被签证书的证书文件名

    String aliasName = "abnerCA";//被签证书在证书库中的alias别名

    char[] namePass = "200100".toCharArray();//被签证书的条目在证书库的私钥密码

    int n =3; //被签证书的有效期,以年为单位,以当前时间开始计算

    int sn = 200406001;//序列号可自己定义,这里定义的意义为2004年6月签发,是本年度CA签发的第多少个以001计算,要求唯一

    String afteraliasName = "abnerCA_Signed"; //签名后新产生的被签过名的证书在库中的别名

    char[] afterNewPass = "200100".toCharArray(); //签名后新产生的被签过名的证书在库的条目的私钥的密码

    //装载证书库

    FileInputStream in = new FileInputStream(name);

    KeyStore ks = KeyStore.getInstance("JKS");//JKS为证书库的类型

    ks.load(in,storepass);

    //从证书库中读出签发者(CA)的证书

    java.security.cert.Certificate cl = ks.getCertificate(alias);//读出一个CA证书,这里的l是字母l不是数据字1

    PrivateKey privateKey = (PrivateKey)ks.getKey(alias,cakeypass);//根据别名和证书密码读出CA证书的私钥

    in.close();

    //从证书库中读出的签发者(CA)的证书中提取签发者的信息

    byte[] encodl = cl.getEncoded();//提取证书的编码,这里是字母l不是数据字1

    X509CertImpl cimpl = new X509CertImpl(encodl);//这里是字母l不是数据字1,根据证书的编码创建X509CertImpl类型的对象

    //根据上面的对象获得X509CertInfo类型的对象,该对象封装了证书的全部内容。

    X509CertInfo cinfo_first =

    (X509CertInfo)cimpl.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);

    //然后获得X500Name类型的签发者信息

    X500Name issuer = (X500Name)

    cinfo_first.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME);

    //获取待签发的证书,即获取被签发者的证书

    //可从密钥库中获取,也可从导出的证书文件中获取,这里给出两种方式 ///

    //方式一、采用从导出的cer文件中获取 start

    ///

    /*

    CertificateFactory cf = CertificateFactory.getInstance("X.509");//X.509是使用最多的一种数字证书标准

    FileInputStream in2 = new FileInputStream(cerFileName);//被签证书文件

    java.security.cert.Certificate c2 = cf.generateCertificate(in2);//生成需要被签的证书

    in2.close();

    byte[] encod2 = c2.getEncoded();

    X509CertImpl cimp2 = new X509CertImpl(encod2);

    //获得被签证书的详细内容,然后根据这个证书生成新证书

    X509CertInfo cinfo_second =

    (X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);

    */

    ///

    //end 方式一

    ///

    ///

    //方式二、从证书库中读出被签的证书 start

    ///

    java.security.cert.Certificate c3 = ks.getCertificate(aliasName);//从证书库中读出被签证书,然后生成新的证书

    byte[] encod3 = c3.getEncoded();

    X509CertImpl cimp3 = new X509CertImpl(encod3);

    X509CertInfo cinfo_second =

    (X509CertInfo)cimp3.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); ///

    //end方式二

    /// //设置新证书的有效期,使之为当前向后n年有效,新证书的

    //截止日期不能超过CA证书的有效日期

    Date beginDate = new Date();

    Calendar cal = Calendar.getInstance();

    cal.setTime(beginDate);

    cal.add(cal.YEAR,n);

    Date endDate = cal.getTime();

    CertificateValidity cv = new CertificateValidity(beginDate,endDate);

    cinfo_second.set(X509CertInfo.VALIDITY,cv);

    //设置新证书的序列号

    CertificateSerialNumber csn = new CertificateSerialNumber(sn);

    cinfo_second.set(X509CertInfo.SERIAL_NUMBER,csn);

    //设置新证书的签发者

    cinfo_second.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,

    issuer);

    //新的签发者是CA的证书中读出来的

    //设置新证书的算法,指定CA签名该证书所使用的算法为md5WithRSA

    AlgorithmId algorithm =

    new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);

    cinfo_second.set(CertificateAlgorithmId.NAME+"."+

    CertificateAlgorithmId.ALGORITHM,algorithm);

    //创建新的签名后的证书

    X509CertImpl newcert = new X509CertImpl(cinfo_second);

    //签名,使用CA证书的私钥进行签名,签名使用的算法为MD5WithRSA

    newcert.sign(privateKey,"MD5WithRSA");//这样便得到了经过CA签名后的证书

    //把新证书存入证书库

    //把新生成的证书存入一个新的证书库,也可以存入原证书库,

    //存入新证书库,则新证书库中不仅包含原证书库中的所有条目,

    //而且新增加了一个这次产生的条目。注意,这时,新产生的签名后的证书只

    //包括公钥和主体信息及签名信息,不包括私钥信息。这里给出两种方式。

    ///

    //方式一:存入新密钥库

    ///

    /*

    ks.setCertificateEntry(afteraliasName,newcert);

    FileOutputStream out = new FileOutputStream(newLib);

    //存入新库signedLib,并设置新库的库访问密码

    ks.store(out,newLibPass);

    out.close();

    */

    ///

    //end 方式一

    ///

    //也可以采用另外一种方式,存入原证书库中

    //存入原库中,即在原证书库中增加一条证书,这个证书是原证书经过签名后的证书

    //这个新证书含有私钥和私钥密码

    ///

    //方式二,存入原密钥库

    ///

    //先在原库中读出被签证书的私钥

    PrivateKey prk = (PrivateKey)ks.getKey(aliasName,namePass);

    java.security.cert.Certificate[] cchain = {newcert};

    //存入原来的库,第二个参数为原证书的私钥,第三个参数为新证书的私钥密码,第三个参数为新证书

    ks.setKeyEntry(afteraliasName,prk,afterNewPass,cchain); //用新密钥替代原来的没有签名的证书的密码

    FileOutputStream out2 = new FileOutputStream(name);

    ks.store(out2,storepass);//存入原来的库中,第二个参数为该库的访问密码

    ///

    //end 方式二

    ///

    }

    }

    运行以上程序,即可运用 MissionCA证书来签发abnerCA证书,运行后在abnerCALib中增加一条别名为abnerCA_Signed的数字证书,我们将它导出为cer文件(导出方法见前)。

    至此,我们己经用 CA的证书以我们的数字证书签名了。在windows中,双击导出的abnerCA_Signend.cer文件,出现如下图所示:

    上图中证书信息一栏显示“不能验证该证书”,原因是因为,我们的这个数字证书的签发者 missionCA证书没有安装到系统中。我们可以将证书库中别名为missionCA的自签数字证书导出为cer文件,然后安装到系统中。再次查双击看此证书,如下图所示:

    到此,我们己经获得了一个由我们自己的 CA签名颁发的个人数字证书。并且将我们自己的CA证书安装到系统中成为系统信任的根证书。于是,以后只要是由我们的这个CA证书签名颁发的数字证书都会受到系统的信任。

    四、利用数字证书给 applet签名

    现在假设我们公司给 xx公司做一个项目,这个项目中需要用到applet,且这些applet需要特权以实现一些特殊的功能(如读出客户端用户系统中C:/winNT/system.ini文件中的内容并显示)。那么我们可以颁发一个数字证书,并给这个数字证书签名,然后用签名后的这个数字证书来签名我们的applet,使客户信任。具体过程如下:

    一、生成一个用于此项目签名 applet 的数字证书,别名定为: mission_water

    生成一个用于此项目签名的数字证书如下:

    keytool –genkey –dname “CN=美森软件-水公司项目,OU=美森系统软件有限公司,O=美森系统软件有限公司,L=成都市,ST=四川省,C=中国” –alias Mission_Water –keyalg RSA –keysize 1024 –keystore abnerCALib –keypass 200100 –storepass 100200 –validity 3650

    二、用我们的 CA(missinCA) 来签发这个数字证书

    然后,运行我们在前面第三节中给定的程序,注意:运行此程序前,请修改以下参数:

    String cerFileName = "Mission_Water.cer";

    String aliasName = "Mission_Water";

    String afteraliasName = "Mission_Water_Signed";

    然后运行,程序会在 abnerCALib证书库中产生一个别名为:Mission_Water_Signed的数字证书,这个证书是经过我们的CA(MissionCA)签发的。

    下面,我们用以下指令导出这个证书:

    keytool -export -alias Mission_Water_Signed -file Mission_Water_Signed.cer -keystore abnerCALib -rfc

    会生成一个 Mission_Water_Signed.cer 文件。

    三、用签发后的数字证书来签名我们的 applet

    我们现在来做一个简单的 applet,它的代码如下:

    package com.applet;

    import java.awt.*;

    import java.awt.event.*;

    import java.applet.*;

    import javax.swing.*;

    import java.io.*;

    public class ShowFileApplet extends JApplet {

    private boolean isStandalone = false;

    private String content = "文件的内容是:"; //自定义的提示信息

    private String fileName = "C://WINNT//system.ini";//读出这个文件的内容

    private TextArea ta = new TextArea(10,80);//自定义的输出框

    public String getParameter(String key, String def) {

    return isStandalone ? System.getProperty(key, def) :

    (getParameter(key) != null ? getParameter(key) : def);

    }

    public ShowFileApplet() {

    }

    public void init() {

    try {

    jbInit();

    myInit();//自己定义的方法

    }

    catch(Exception e) {

    e.printStackTrace();

    }

    }

    private void jbInit() throws Exception {

    this.setSize(new Dimension(400,300));

    }

    /**

    * 自定义的初始化方法,读入系统中的一个文件的内容并保存起来,然后,增加一个

    * 可视化的输出框

    */

    private void myInit(){

    String s;

    BufferedReader in;

    try {

    in = new BufferedReader(new FileReader(fileName));

    while ( (s = in.readLine()) != null) {

    content +=s + "/n";

    }

    }catch (IOException ex) {

    ex.printStackTrace();

    }

    System.out.println(content);

    ta.setText(content);

    getContentPane().add(ta);

    }

    /*

    *重载的方法,输出内容

    **/

    public void paint(Graphics g){

    ta.setText(content);

    }

    public String getAppletInfo() {

    return "Applet Information";

    }

    public String[][] getParameterInfo() {

    return null;

    }

    //static initializer for setting look & feel

    static {

    try {

    }

    catch(Exception e) {

    }

    }

    }

    好了,这个 applet写好了,下面我们来把这个applet编译打包成jar文件。

    编译此 applet文件,会在当前目录(当前目录为classes目录)下生成一个com/applet的目录结构,在applet目录下有一个ShowFileApplet.class,进入当前目录,执行:

    jar cvf myapplet.jar com/applet/*.*

    于是在当前目录下产生一个 myapplet.jar文件。

    然后再在当前目录(当前目录为 classes目录)下新建一个applet目录,专门存放applet的jar文件,把前面生成的数字证书库abnerCALib这个文件也copy到applet目录下面来,同时把刚才生成的myapplet.jar文件也移到applet目录下面来。然后进入该目录执行:

    jarsigner -keystore abnerCALib myapplet.jar Mission_Water_Signed

    Enter Passphrase for keystore: 100200

    Enter key password for Mission_Water_Signed: 200100

    即用 Mission_Water_Signed这个我们的CA签发的数字证书给这个applet签名了。

    四、运行我们的 applet

    我们来写一个 html文件来运行这个签名后的applet,内容如下:

    <!-- ShowFileApplet.html -->

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=GB2312">

    <title>HTMLTestPage</title>

    </head><body>

    applet将会显示,如果你的浏览器支持Java<br>

    <applet

    archive = "./applet/myapplet.jar"

    code = "com.applet.ShowFileApplet.class"

    name = "TestApplet"

    width = "400"

    height = "300"

    hspace = "0"

    vspace = "0"

    align = "middle"

    >

    </applet>

    </body>

    </html>

    这个 HTML文件可以运行applet,但如果浏览器不支持Java,即没有安装JRE,它不会提示用户去下载安装。我们可以用Java自带的htmlconverter工具转换一下这个HTML文件,转换后的文件可以在支持JAVA2的浏览器中(不管该浏览器是否设置了使用java2运行applet,它都会在Java2环境中运行applet,如果浏览器不支持Java2,则会自动下载所需的文件。

    在 DOS方式下运行htmlconverter,弹出如下图所示画框,按图中所示选择刚才的那个HTML文件,如下图所示:

    点“转换”,将会在当前目录下生成一个 HTML文件,并把原来的HTML文件备份了。

    生成后的 HTML文件内容如下所示:

    <!-- ShowFileApplet.html -->

    <html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=GB2312">

    <title>HTMLTestPage</title>

    </head>

    <body>

    applet将会显示,如果你的浏览器支持Java<br>

    <OBJECT

    classid = "clsid:CAFEEFAC-0014-0001-0001-ABCDEFFEDCBA"

    codebase = "http://java.sun.com/products/plugin/autodl/jinstall-1_4_1_01-windows-i586.cab#Version=1,4,1,1"

    WIDTH = "400" HEIGHT = "300" NAME = "TestApplet" ALIGN = "middle" VSPACE = "0" HSPACE = "0" >

    <PARAM NAME = CODE VALUE = "com.applet.ShowFileApplet.class" >

    <PARAM NAME = ARCHIVE VALUE = "./applet/myapplet.jar" >

    <PARAM NAME = NAME VALUE = "TestApplet" >

    <PARAM NAME = "type" VALUE = "application/x-java-applet;jpi-version=1.4.1_01">

    <PARAM NAME = "scriptable" VALUE = "false">

    <COMMENT>

    <EMBED

    type = "application/x-java-applet;jpi-version=1.4.1_01"

    CODE = "com.applet.ShowFileApplet.class"

    ARCHIVE = "./applet/myapplet.jar"

    NAME = "TestApplet"

    WIDTH = "400"

    HEIGHT = "300"

    ALIGN = "middle"

    VSPACE = "0"

    HSPACE = "0"

    scriptable = false

    pluginspage = "http://java.sun.com/products/plugin/index.html#download">

    <NOEMBED>

    </NOEMBED>

    </EMBED>

    </COMMENT>

    </OBJECT>

    </body>

    </html>

    双击打开运行这个文件或把这个文件及 applet目录发布到WEB Server中去,可以访问运行这个applet。运行时,弹出如下图所示对话框:

    如果此时你点“是”,则在这次会话过程中,此 applet具有访问本地文件系统的权限,但下次运行时还要提示此信息。如果你点“总是有效”则以后每次访问此类含有由Mission_Water_Signed数字证书签发的applet页面,都不会再弹出此选择框。因为:你选择了总是有效,这样,Java会在Java Plug-in中记录这个信任的数字证书,除非你把Java Plug-in中记录的这个信任证书删除。在win2k中,可以在“控制面版”->Java Plug-in中看到。如下图所示:

    点选择“总是有效”后,该程序运行的结果如下图所示:

    五、作者简介:

    abnerchai( 柴政 ), 24岁,西南交通大学计算机与通信工程学院~计算机应用技术硕士研究生、高级程序员。熟悉VC++/JAVA编程,主要研究方向为:网络安全,j2EE/中间件技术,工作流技术(wfmc)。个人联系方式为:josserchai@yahoo.com ;目前在成都美森系统软件有限公司兼职从事基于IBM WAS/WSAD平台的J2EE/EJB/JCE/JMS/JDBC/Servlets/JSP/JavaScript/开发。

    返回 Top

    25、为测试 Java 应用程序生成证书链

    使用 OpenSSL 工具箱

    Paul H. Abbott
    pabbott@hursley.ibm.com
    软件工程师, IBM
    2004 年 9 月

    学习如何创建数字证书链以测试您的软件。IBM 软件工程师 Paul H. Abbott 通过展示如何使用可免费获得的 OpenSSL 工具箱创建任意长度的证书链,阐明了这个很少有文档说明的过程。他还描述了常见的证书属性,并展示了一些将证书读取到 Java keystore 中的示例 Java 代码。

    如果正在开发用于公钥基础设施 (PKI) 实现安全性的 Java 软件,那么通常需要创建 数字证书链 (也称为 证书路径) 以进行测试。这是比较简单的任务,但是关于它的文档说明非常少。本文描述了如何用开源 OpenSSL 工具箱 (请参阅 参考资料)创建任意长度的证书链。还介绍了一些常见的证书属性并分析了一个读取证书到 Java keystore 中的示例应用程序。

    数字证书:快速回顾
    本文假定您熟悉 PKI 基础知识,因此我只对数字证书的目的和结构给予简要回顾以帮助说明证书链的概念。

    数字证书的主要用途是验证签名数据的来源,如电子邮件和 JAR 文件。用证书验证签名的数据使接收者知道数据的来源以及它在传输过程中是否改变过。

    在高层,一个数字证书包含一个 惟一名 (DN) 和一个 公钥。DN 标识一个具有与证书的公钥匹配的 私钥 的实体——如一个人。通过用私钥对证书签名并将签名放到证书中而将两者结合到一起。

    一个由匹配证书公钥的私钥签名的证书称为 自签名 证书。根证书颁发机构 (Root certification authority,CA) 证书就属于这一类。用户证书通常是由不同的私钥签名的,如 CA 的私钥。这构成了两证书链。验证用户证书为真涉及验证其证书中的签名,这需要 CA 的公钥。但在在可以使用 CA 的公钥之前,需要对封装的 CA 证书进行验证。因为 CA 证书是自签名的,所以用 CA 公钥验证证书。

    用户证书需要用根 CA 的私钥签名。它可以用一个中介的私钥签名,这个私钥的证书是用 CA 的私钥签名的。这是一个三证书链的例子:用户证书、中介证书和 CA 证书。但是在链中可以有多个中介,因此证书链可以有任意的长度。

    值得一提的另一点是证书可以包含额外信息,称为 extension。Extension 可以指定证书的用途以及其他内容。根据于证书的用途,某些 extension 有可能非常重要。

    用 OpenSSL 创建证书
    有一些创建证书的工具。可以使用在 Java SDK 中自带的一个命令行工具 keytool 创建自签名的证书。但是证书链需要更复杂的软件,如 OpenSSL。

    获得 OpenSSL
    可以免费下载 OpenSSL (请参阅 参考资料)。如果使用 UNIX,那么很可能在操作系统中已经安装了 OpenSSL,或者它是操作系统的安装选项。Linux 用户应当查看: /usr/share/ssl。Microsoft MKS toolkit 也带有某个版本的 OpenSSL。 (在我的计算机中它是在 C:/Program Files/MKS Toolkit/etc/openssl。) 如果使用 Windows 但是没有 MKS,那么可以从 SourceForge 得到必要的二进制文件 (请参阅 参考资料)。大多数安装由三个主要文件组成:OpenSSL 二进制文件、一个 CA.sh shell 脚本和一个 openssl.cnf 配置文件。(SourceForge 的软件包缺少 CA.sh 文件。可以下载源代码包获得缺少的文件。)

    安装后,保证 CA.sh 和 OpenSSL 可执行文件在路径中。然后就可以开始创建根证书了。

    创建根证书
    CA shell 脚本使创建根证书成为一项相对容易的工作。首先,进入要存放 CA 数据的目录。 (我使用 temp/OpenSSL 目录。) 然后键入:

    
    CA -newca
    

    这会产生一个像清单 1 的对话框,它包括我在提示符下输入的示例信息:

    清单 1. 创建根证书

    
    $ CA.sh -newca
    CA certificate filename (or enter to create)
    
    Making CA certificate ...
    Using configuration from C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
    Loading 'screen' into random state - done
    Generating a 1024 bit RSA private key
    ......++++++
    ...++++++
    writing new private key to './demoCA/private/./cakey.pem'
    Enter PEM pass phrase:
    Verifying password - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    You will see a number of fields, but you can leave some blank.
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:UK
    State or Province Name (full name) [Some-State]:Hampshire
    Locality Name (e.g., city) []:Winchester
    Organization Name (e.g., company) [Internet Widgits Pty Ltd]:IBM UK Ltd
    Organizational Unit Name (e.g., section) []:JTC
    Common Name (e.g., YOUR name) []:Pauls Root Certificate
    Email Address []:Paul_Abbott@uk.ibm.com
    $
    

    完成对话框后,OpenSSL 创建以下目录结构:

    
    demoCA/
       cacert.pem              - root certificate
       index.txt               - empty
       serial                  - text file containing "01"
       certs/                  - empty
       crl/                    - empty
       newcerts/               - empty
       private/cakey.pem       - private key
    

    下面是在主目录中文件的简单说明:

    • cacert.pem 是这个 CA 的 PEM 编码的(请参阅侧栏 PEM 文件格式)根证书。根证书验证由根私钥签名的证书。
    • index.txt 是包含所有发布的证书列表的文件。
    • serial 包含将指定给由这个 CA 发布的证书的下一个可用序列号。换一种说法,它是在这个根证书对签名请求签名时指定给一个证书的惟一序列号。
    • cakey.pem 是根私钥。这个密钥用于签名证书请求。它也是 PEM 编码的。

    您定义目录名 (在这个例子中是 demoCA) 和根证书的有效周期,在 CA.sh 中它默认为 365 天。如果想要改变这些值,必须编辑这个文件。

    PEM 文件格式
    OpenSSL 使用 PEM 文件格式存储证书和密钥。PEM 实质上是 Base64 编码的二进制内容,再加上开始和结束行,如证书文件的
    -----BEGIN CERTIFICATE-----

    -----END CERTIFICATE-----
    。 在这些标记外面可以有额外的信息,如编码内容的文字表示。文件是 ASCII 的,可以用任何文本编辑程序打开它们。观察这个 示例 PEM 文件

    生成用户证书
    生成用户证书有两步:生成一个请求和对请求签名。CA shell 脚本可以用 -newreq (生成一个新的请求) 和 -sign (签名一个新请求) 操作符完成这两步。

    生成一个新请求
    执行 CA -newreq 命令会启动一个类似于生成新根证书时看到的对话框。一个主要的不同是这个对话框提示您输入 PEM 密码短语,OpenSSL 将使用这个短语编码私钥,然后将它写入输出文件。

    输出文件名为 newreq.pem,包含私钥和签名请求,可以将它想像为未签名的证书。清单 2 显示了一个新请求对话框的例子。

    清单 2. 示例 -newreq 对话框

    
    Using configuration from 
    C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
    Loading 'screen' into random state - done
    Generating a 1024 bit RSA private key
    ......................++++++
    ...++++++
    writing new private key to 'newreq.pem'
    Enter PEM pass phrase:
    Verifying password - Enter PEM pass phrase:
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    You will see a number of fields, but you can leave some blank.
    For some fields there will be a default value.
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:UK
    State or Province Name (full name) [Some-State]:Hampshire
    Locality Name (e.g., city) []:Winchester
    Organization Name (e.g., company) [Internet Widgits Pty Ltd]:IBM Uk Ltd
    Organizational Unit Name (e.g., section) []:JET
    Common Name (e.g., YOUR name) []:Paul Abbott
    Email Address []:Paul_H_Abbott@uk.ibm.com
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:qwerty
    An optional company name []:
    Request (and private key) is in newreq.pem
    

    对请求签名
    执行 CA -sign 命令会用包含在 private/cakey.pem 中的根 CA 的私钥签名请求。请求需要在一个名为 newreq.pem 的文件中,生成的证书写入到名为 newcert.pem 的文件中,这两个文件都在当前目录中。清单 3 显示了示例请求-签名对话框。

    清单 3. 示例 -sign 对话框

     
    $ CA.sh -sign
    Using configuration from C:/PROGRA~1/MKSTOO~1/etc/openssl/openssl.cnf
    Loading 'screen' into random state - done
    Enter PEM pass phrase:
    Check that the request matches the signature
    Signature ok
    The Subjects Distinguished Name is as follows
    countryName           :PRINTABLE:'UK'
    stateOrProvinceName   :PRINTABLE:'Hampshire'
    localityName          :PRINTABLE:'Winchester'
    organizationName      :PRINTABLE:'IBM UK Ltd'
    organizationalUnitName:PRINTABLE:'JET'
    commonName            :PRINTABLE:'Paul Abbott'
    emailAddress          :IA5STRING:'Paul_H_Abbott@uk.ibm.com'
    Certificate is to be certified until Jun 22 20:50:55 2005 GMT (365 days)
    Sign the certificate? [y/n]:y
    
    
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 2 (0x2)
            Signature Algorithm: md5WithRSAEncryption
            Issuer: C=UK, ST=Hampshire, L=Winchester, O=IBM UK Ltd, 
              OU=JTC, CN=Paul H Abbott/Email=Paul_H_Abbott@uk.ibm.com
            Validity
                Not Before: Jun 22 20:50:55 2004 GMT
                Not After : Jun 22 20:50:55 2005 GMT
            Subject: C=UK, ST=Hampshire, L=Winchester, O=IBM Uk Ltd, 
              OU=JET, CN=Paul Abbott/Email=Paul_H_Abbott@uk.ibm.com
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (1024 bit)
                    Modulus (1024 bit):
                        00:e2:b5:90:50:e5:dd:7c:79:c3:49:a5:c9:ee:29:
                        3a:da:1d:8b:6a:b0:0b:a0:a1:cf:79:fc:be:50:db:
                        cb:37:b7:54:00:bb:6e:74:e6:a4:11:d4:c6:5a:02:
                        46:3b:b4:33:72:97:5b:cf:9d:9a:32:9b:e6:34:e9:
                        4b:30:4e:b6:68:55:8a:3f:80:f3:5e:c9:63:cc:4e:
                        c2:c0:c3:34:2f:93:9f:fa:ca:1b:44:f5:c8:87:ec:
                        1d:12:a9:8c:3a:b9:28:83:4d:b5:18:ff:34:3a:a9:
                        e7:7e:4e:c4:21:8e:56:e7:dc:f5:07:46:39:c8:d8:
                        ff:00:d3:87:20:2e:06:18:19
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    FA:65:44:FB:3A:E6:15:1F:C5:40:6C:EB:F4:DA:AB:B9:CD:F2:2D:54
                X509v3 Authority Key Identifier:
                    keyid:93:8C:B4:F0:30:95:77:59:2E:A1:3B:0C:A5:3A:C6:92:FA:16:31:6D
                    DirName:/C=UK/ST=Hampshire/L=Winchester/O=IBM UK Ltd/
                      OU=JTC/CN=Paul H Abbott/Email=Paul_H_Abbott@uk.ibm.com
                    serial:00
    
        Signature Algorithm: md5WithRSAEncryption
            27:43:6d:89:c3:61:d4:af:3e:dc:55:a3:9a:a7:7d:66:4e:29:
            2e:43:f0:90:c6:9c:0f:62:24:b2:4c:9e:2c:f7:d7:84:ce:7f:
            b6:c8:09:3d:b4:80:c8:26:9a:a8:6b:2f:df:8f:e3:8b:80:f5:
            10:28:80:28:5e:94:55:be:61:e5:18:4e:d4:a8:c2:9e:6d:9b:
            52:64:94:33:b3:a5:68:79:e2:85:86:01:e6:aa:0f:1e:54:2d:
            80:b1:37:38:66:cc:09:9a:0e:30:0a:e8:b9:00:7d:da:a2:a1:
            bb:3c:83:37:2f:16:6a:5d:84:25:66:23:d2:67:a9:02:a4:33:
            96:56
    -----BEGIN CERTIFICATE-----
    MIID0jCCAzugAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBmjELMAkGA1UEBhMCVUsx
    EjAQBgNVBAgTCUhhbXBzaGlyZTETMBEGA1UEBxMKV2luY2hlc3RlcjETMBEGA1UE
    ChMKSUJNIFVLIEx0ZDEMMAoGA1UECxMDSlRDMRYwFAYDVQQDEw1QYXVsIEggQWJi
    b3R0MScwJQYJKoZIhvcNAQkBFhhQYXVsX0hfQWJib3R0QHVrLmlibS5jb20wHhcN
    MDQwNjIyMjA1MDU1WhcNMDUwNjIyMjA1MDU1WjCBmDELMAkGA1UEBhMCVUsxEjAQ
    BgNVBAgTCUhhbXBzaGlyZTETMBEGA1UEBxMKV2luY2hlc3RlcjETMBEGA1UEChMK
    SUJNIFVrIEx0ZDEMMAoGA1UECxMDSkVUMRQwEgYDVQQDEwtQYXVsIEFiYm90dDEn
    MCUGCSqGSIb3DQEJARYYUGF1bF9IX0FiYm90dEB1ay5pYm0uY29tMIGfMA0GCSqG
    SIb3DQEBAQUAA4GNADCBiQKBgQDitZBQ5d18ecNJpcnuKTraHYtqsAugoc95/L5Q
    28s3t1QAu2505qQR1MZaAkY7tDNyl1vPnZoym+Y06UswTrZoVYo/gPNeyWPMTsLA
    wzQvk5/6yhtE9ciH7B0SqYw6uSiDTbUY/zQ6qed+TsQhjlbn3PUHRjnI2P8A04cg
    LgYYGQIDAQABo4IBJjCCASIwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl
    blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFPplRPs65hUfxUBs
    6/Taq7nN8i1UMIHHBgNVHSMEgb8wgbyAFJOMtPAwlXdZLqE7DKU6xpL6FjFtoYGg
    pIGdMIGaMQswCQYDVQQGEwJVSzESMBAGA1UECBMJSGFtcHNoaXJlMRMwEQYDVQQH
    EwpXaW5jaGVzdGVyMRMwEQYDVQQKEwpJQk0gVUsgTHRkMQwwCgYDVQQLEwNKVEMx
    FjAUBgNVBAMTDVBhdWwgSCBBYmJvdHQxJzAlBgkqhkiG9w0BCQEWGFBhdWxfSF9B
    YmJvdHRAdWsuaWJtLmNvbYIBADANBgkqhkiG9w0BAQQFAAOBgQAnQ22Jw2HUrz7c
    VaOap31mTikuQ/CQxpwPYiSyTJ4s99eEzn+2yAk9tIDIJpqoay/fj+OLgPUQKIAo
    XpRVvmHlGE7UqMKebZtSZJQzs6VoeeKFhgHmqg8eVC2AsTc4ZswJmg4wCui5AH3a
    oqG7PIM3LxZqXYQlZiPSZ6kCpDOWVg==
    -----END CERTIFICATE-----
    Signed certificate is in newcert.pem
    

    注意对话框中请求的 PEM 密码是用来加密根 CA 的私钥——而不是用户的私钥——的密码。

    在签名后检查 demoCA 目录,可以看到 index.txt 和 serial 文件已经更新。生成的公钥也放到了 demoCA/newcert/ 目录中,文件名反映了其序列号——如 01.pem。

    这时,有了一个用户证书、一个用户私钥和根证书。如果就需要这些,那么就可到此为止了。如果想要知道如何控制证书内容或者创建一个三(或者更多)证书链,则请继续往下读。

    在 CA.sh 背后
    到目前为止,我展示了如何用 CA.sh shell 脚本简化证书生成过程。但是在背后,CA.sh 使用 OpenSSL 命令执行所有必要的密钥生成和签名操作。通过 openssl.cnf 配置文件控制 OpenSSL。我将讨论这个文件的某些部分和它们影响的 CA.sh 操作。

    CA -newca
    正如我在前面说过的,CA -newca 操作为 CA 创建必要的目录结构:

    
    dir             = ./demoCA              # Where everything is kept
    certs           = $dir/certs            # Where the issued certs are kept
    crl_dir         = $dir/crl              # Where the issued crl are kept
    database        = $dir/index.txt        # database index file.
    new_certs_dir   = $dir/newcerts         # default place for new certs.
    
    certificate     = $dir/cacert.pem       # The CA certificate
    serial          = $dir/serial           # The current serial number
    crl             = $dir/crl.pem          # The current CRL
    private_key     = $dir/private/cakey.pem# The private key
    

    这个操作创建在 openssl.cnf 中的 CA_default 一节中定义的目录,尽管 CA.sh 不直接引用配置文件。如果想要使用不同的结构,需要修改 openssl.cnf 并手工创建所需要的目录。也可以修改 CA.sh 以创建目录。.

    下面对 OpenSSL 的调用生成一个根证书:

    
    openssl req -new -x509 -keyout ./demoCA/private/cakey.pem 
      -out ./demoCA/cacert.pem -days 365
    

    -days 标志设置根证书的生存期为 365 天 (一年),它覆盖了在 openssl.cnf 中指定的所有值。

    CA -newreq
    openssl.cnf 的 req 一节控制新证书请求的生成,如下面的例子所示:

    
    [ req ]
    default_bits        = 1024
    default_keyfile     = privkey.pem
    distinguished_name  = req_distinguished_name
    attributes          = req_attributes
    

    第一行确定生成的密钥对的长度,第二行确定生成的私钥的默认目标文件。后面两行指向同一文件的其他节。

    req_distinguished_name 一节定义了要放在证书请求中的 DN 组件,这些组件最终要进入签名的证书中:

    
    [ req_distinguished_name ]
    countryName                 = Country Name (2 letter code)
    countryName_default         = AU
    countryName_min             = 2
    countryName_max             = 2
    
    stateOrProvinceName         = State or Province Name (full name)
    
    localityName                = Locality Name (e.g., city)
    
    organizationName            = Organization Name (e.g., company)
    
    organizationalUnitName      = Organizational Unit Name (e.g., section)
    
    commonName                 = Common Name (e.g., YOUR name)
    
    emailAddress                = Email Address
    

    这一节的每一部分包含最多四个值,如例子中的第二到第五行所示:

    • 打印到屏幕上的消息提示
    • 一个默认值 (后缀 _default
    • 用户可以键入的最少字符数 (后缀 _min
    • 用户可以输入的最多字符数 (后缀 _max

    还有其他几个选项。它们包括定义自己的对象标识符 (OID) 类型和让惟一名值在配置文件中定义而不是由用户提供,这对于批处理操作会很有用。req_attributes 一节可以定义加密密码的最小和最大长度,以及其他内容。

    new-request 操作的 OpenSSL 调用为:

    
    openssl req -new -keyout newreq.pem -out newreq.pem -days 365
    
    

    注意 -keyout 选项覆盖了配置文件中的 default_keyfile 一行。同样,生成的证书的生存期设置为 365 天。如果拿这个一行与生成根证书的那一行比较,您会看到只有一处不同:-x509。它告诉 OpenSSL 您需要一个自签名的证书。

    可以在 OpenSSL 文档 (请参阅 参考资料) 的 req 一节中找到更多关于使用 OpenSSL 生成签名请求的信息。

    CA -sign
    签名操作,就像请求生成操作一样,使用对 OpenSSL 的调用对证书签名:

    
    openssl ca -policy policy_anything -out newcert.pem 
      -infiles newreq.pem
    

    值得注意的是 OpenSSL 命令是 ca 而不是 sign,没有指定用来签名的私钥。openssl.cnf 配置文件定义了这些信息。有关的一节是 CA_default,尽管可以使用 -name 选项覆盖它。

    -policy 参数指定配置文件中的策略一节。用这一节指定哪些字段必须出现在 DN 请求中,哪些是可选的。我通常使用这种配置:

    
    [ policy_anything ]
    countryName             = optional
    stateOrProvinceName     = optional
    localityName            = optional
    organizationName        = optional
    organizationalUnitName  = optional
    commonName              = supplied
    emailAddress            = optional
    

    可以看到,这种配置默认情况下要求很低。值得注意的是文档声明没有在这里列出的 DN 字段将会无声无息地从签名的请求中删除。

    签名第三个证书
    本书的 创建根证书生成一个用户证书 两节展示了如何用 CA.sh shell 脚本创建根证书,然后用根证书签名用户证书。如果只想有一个两证书链,那些这个过程就足够了,但是如果在链中需要三个或者更多的证书呢?回答是直接使用 OpenSSL 命令。既然知道了 CA.sh 脚本是如何工作的,就可以利用这些知识创建一个三证书链。其步骤类似于创建二证书链的步骤。为了简化,将重复使用上一例子中的 CA 证书/私钥和用户请求。

    首先重命名现有的用户请求文件为 userRequest1.pem。然后创建一个新的用户证书,将称它为 userCert1。现有的用户证书没有标记为 CA 证书,并且不能用于对其他证书签名。(只有在试图验证一个包含这种证书的证书链时才会看到这一点。)

    需要添加以下一节,它使证书可以根据配置文件对证书签名:

    
    [ my_v3_ext ]
    basicConstraints = CA:true
    

    使用以下命令来签名证书:

    
    openssl ca -policy policy_anything -extensions my_v3_ext 
      -out userCert1.pem -infiles userRequest1.pem
    

    下一步,为第三个证书生成一个新的证书请求。可以使用 CA -newreq 命令完成这项任务,也可以直接使用 OpenSSL 命令。

    有了请求文件后,需要对它签名。如前所述,用来对请求签名的私钥默认是在配置文件中而不是 openssl ca 命令中指定的。但是 openssl ca 命令可以包含一个 -keyfile 选项,它让您可以覆盖这个默认值。 下面的命令使用第二个证书签名第三个证书:

    
    openssl ca -policy policy_anything -keyfile userRequest1.pem 
      -cert userCert1.pem -out userCert2.pem -infiles newreq.pem
    

    注意 -cert 参数指定了签名者的证书,覆盖了配置文件中的默认值。不用这个参数调用这个命令将会产生一个错误,因为 OpenSSL 会检查私钥和签名者的证书是否匹配。

    假定一切顺利,在当前目录中应当有 userCert1.pem 和 userCert2.pem 文件,在 demoCA/private 目录中有根 CA 证书。这三个文件构成了证书链。如果使用 Windows,那么应当可以通过在文件浏览器中更改文件名使它们具有 .cer 扩展名,并双击它们来安装证书。

    其他选项
    可以发现下面 OpenSSL 命令行选项很有用:

    • -startdate, -enddate & -days 可以指定生成的证书的有效周期。在默认情况下,一个证书从当前日期起一年有效。
    • -notext 可以关闭出现在二进制编码版本之前的已生成证书的文字表述。文字版本通常不是必需的。
    • -key 是用来加密私钥的密码。它在要从一个批处理文件中调用 OpenSSL 时很有用。
    • -batch 告诉 OpenSSL 在批处理模式下工作,没有用户提示。
    • -extfile 指定一个文件包含证书扩展。

    将证书装载到 Java keystore
    Java keystore 是私钥的存储库,相关的 X.509 证书链认证对应的公钥。让证书链进入 Java keystore 需要一个简单的 Java 程序。清单 4 中的代码片段将所创建的三证书链读入到一个现有的 keystore 中:

    清单 4. 将证书链装载到 Java keystore

    
     // The keystore to add the certificates to
     FileInputStream ksis = new FileInputStream(".keystore");
    
     // The new keystore with the certificates added
     FileOutputStream ksos = new FileOutputStream(".newkeystore");
    
     // The certificate files, to be added to keystore
     FileInputStream certFile1 = new FileInputStream("cacert.cer");
     FileInputStream certFile2 = new FileInputStream("userCert1.cer");
     FileInputStream certFile3 = new FileInputStream("userCert2.cer");
    
     CertificateFactory cf = CertificateFactory.getInstance("X.509");
    
     // Read the 3 certificates into memory
     Certificate cert1 = cf.generateCertificate(certFile1);
     Certificate cert2 = cf.generateCertificate(certFile2);
     Certificate cert3 = cf.generateCertificate(certFile3);
    
     // Read the keystore file, type="jks"
     KeyStore ks = KeyStore.getInstance("jks");
     char[] password = "password".toCharArray();
    
     ks.load(ksis, password);
    
     // Add certificates to keystore
     ks.setCertificateEntry("MYROOT_ALIAS", cert1);
     ks.setCertificateEntry("MYUSER1_ALIAS", cert2);
     ks.setCertificateEntry("MYUSER2_ALIAS", cert3);
    
     // Write modified keystore to file system
     ks.store(ksos, password);
    
     ksos.close();
    

    在清单 4 中,keystore 的密码是 password,keystore 类型是 jks。证书进入 keystore 后,任何配置为访问这个keystore 的 Java 应用程序都可以使用它们。Sun 的 JDK 文档包含了如何做到这一点的信息。

    结束语
    正如您现在可能已经认识到的,可以用 OpenSSL 实现非常简单的 CA 并发布证书。您可能决定在完成自己的测试应用程序后,使它获得您的证书链。不过,这种方式需要承担验证所有证书的来源并管理已发布证书的责任。另一方面,您可能决定使用外部 CA 来发布证书,如 thawte 或 VeriSign,这种方式也有其优点和缺点。

    本文展示了如何为使用基于 PKI 的安全性的测试 Java 应用程序创建证书链。为了不分散这个主题,我没有触及您可能会感兴趣的相关领域,如在其他应用程序 (如电子邮件) 中使用生成的证书链,如何在另一种语言中使用生成的证书链,以及证书吊销列表。如果您有意了解这些内容以及网络安全性和数字证书的复杂主题的其他领域,请参阅 参考资料 一节中提供的一些极好的信息资源。

    参考资料

    • 下载最新版本的 OpenSSL 源代码
    • The OpenSSL Documentation 是 OpenSSL 命令的主文档。它还不完整,但是仍然相当有用。
    • 如果使用 Windows 但是没有 MKS,可以从 SourceForge 下载必要的 OpenSSL 二进制文件
    • Introduction to Public Key Infrastructure 提供了对 PKI 的基本介绍。
    • Jalal Feghhi 和 Peter Williams 的 Digital Certificates: Applied Internet Security (Addison-Wesley Professional,1998) 描述了数字证书及它们的使用,主要是从 Windows 的角度。
    • Marco Pistoia et al. 的 Java 2 Network Security, 2nd Edition (Prentice Hall PTR,1999) 提供了关于 Java 2 安全性的有用背景知识。
    • 安全专家 Brad Rubin 撰写了这个讨论 Java 安全性的全面的由两部分组成的入门教程。 Part 1, Crypto basicsdeveloperWorks,2002 年 7 月)引导您学习关于加密的基础知识以及如何在某 Java 编码语言中实现它,Part 2, Authentication and authorizationdeveloperWorks,2002 年 7 月) 介绍了认证的基础知识并提供了 JAAS 体系结构的概述。
    • Internet Engineering Task Force (IETF) Request for Comment (RFC) 2459 描述了在 Internet 上使用的 X.509 v3 证书和 X.509 v2 证书吊销列表 (CRL)。
    • IETF RFC 1617 提供了 X.500 目录命名和结构指导。
    • "Java 安全的演进" (developerWorks,2002 年 6 月) 提供了开发和发展 Java 安全性的高层概述。
    • PKI 包 包含发布数字证书的证书权威机构的一长串清单。
    • Which SSL: The SSL Certificate Buyers Guide 设计用于帮助您确定选择哪个提供商来提供数字证书。
    • IBM alphaWorks 的 KeyMan 是管理密钥、证书、CRL 以及存储和获取这些条目的相应存储库的工具。
    • developerWorks Java 技术专区 中可找到数百种 Java 技术资源。
    • 请访问 Developer Bookstore,获取技术书籍的完整列表,其中包括数百本 Java 相关主题 的书籍。
    • 是否对无需通常的高成本入口点(entry point )或短期评估许可证的 IBM 测试产品感兴趣? developerWorks Subscription 为 WebSphere®、DB2®、Lotus®、Rational® 和 Tivoli® 产品提供了低成本的 12 个月单用户许可证,包括基于 Eclipse 的 WebSphere Studio IDE,用于开发、测试、评估和展示您的应用程序。

    返回 Top

    26、关于配置证书服务器,和自己颁发企业证书

    最近BOSS说希望通过电子证书来控制权限,所以自己研究了一下数字证书。发现用它
    来控制权限很方便。设置起来也不麻烦。
    首先需要一台服务器,这台服务器用来给其他用户颁发证书,服务器的操作系统为
    advance server 2000或2003。之后要安装证书服务。
    http://www.microsoft.com/china/community/program/originalarticles/TechDoc/ISA_RRAS.mspx
    中关于“证书服务安装配置”有详细的说明。

    因为微软已经做好了
    我们只要利用这个服务就可以给用户颁发证书了。
    当然首先要给自己颁发一个服务器证书,当作根证书来用。
    制作服务器证书:
    1、打开IIS管理器。右击default web。选属性---〉目录安全性
    安全通道 里面的服务器证书。
    2、选择创建一个新证书。
    3、选择现在准备请求,但稍后发送。
    4、选择加密长度,1024也应该够用了。
    5、填写组织名称,可以填写公司的名称。
    6、公用名称,最好为URl格式的一个名称。
    7、基础信息填写
    8、保存为一个文本文件。类似于
    -----BEGIN NEW CERTIFICATE REQUEST-----
    ..........
    kneGdj5fRnnfgDYzhFE4a4sXKncMP2PT06Bie4SmQ14=
    .........
    -----END NEW CERTIFICATE REQUEST-----

    9、登录
    假设服务器名字为CAServer
    首先登录http://CAServer/certsrv
    点击“申请证书”----〉高级用户
    10、选择
    “使用 base64 编码的 PKCS #10 文件提交一个证书申请,或使用 base64 编码的 PKCS #7 文件更新证书申请。”
    11、然后把第8步生成的文本内容拷贝到“Base64 编码
    证书申请”的文本框中。然后提交。
    12、就会生成服务器证书。安装就可以了。
    这就做好服务器证书了。

    我现在的是用客户端证书映射用户,来控制权限。也就是客户端机器通过证书服务申请一个证书,导入到自己机器中,然后导出PKCS #7类型证书后缀名为.P7B。然后把导出的证书导入到服务器上。之后就可以对使用
    这个证书访问服务器的客户端进行验证了。在服务器端,你可以把需要权限验证的网站的虚拟目录限制只有那些用户可以访问,然后把导入的证书映射为拥有权限的用户。那么这个用户就可以访问网站了。

    返回 Top

    27、数字证书的基本概念

    证书说白了就是跟身份证一样的东西,只不过是在网上使用,发证机关不是公安局而是证书中心而已。下面为了容易理解,我大概列出几点,可能不是很准确:((项目 身份证 证书姓名(单位等) 记录个人信息 与身份证相同签名(证明合法性) 公安局的防伪章 证书中心签名公 钥 无 让别人加密发给你的信息, 只有你能用相应的私钥解开。总之,证书的主要作用就跟身份证在生活中的作用一样,是你在网上的合法的身份证明,当然是不可伪造的(签名的作用)。另外,证书还通过公钥给别人(任何人)跟你进行安全对话的途径。一般来说,证书只用于非对称密钥算法中,但也有特殊的情况。证书首先要想证书发放中心(CA) 申请,获得合法的证书,然后就可以使用了。如果在IE里,直接导入到 IE里面就可以了,很简单。一般来说,安全的证书应该是有如下产生过程:自己生产私钥(保存在自己的机器里)和公钥对,根据证书中心的要求填写个人信息并将之与公钥一起发送给证书中心,证书中心检查申请人的信息,如果符合要求,则用证书中心的根证书签发合法证书,并将证书发给申请人,同时在数据库中备份,更新证书中心数据库信息。 以上是我的一点浅薄理解,如果有不对的,欢迎大家指正。
        
        Q:证书除了x.509格式之外还有其他的格式吗?
        证书文件的后缀我看到有.crt,.pem,.der。这三种是编码格式的不同吗?
        用openssl ca -in req.pem -out xxxx,签署一个证书申请时,是通过xxxx来指定使用哪一种编码格式吗?
        A:那些后缀是无所谓的了.这些后缀的意义跟系统关系更大,文件编码是在文件里面说明的。
        处理X509格式的,还有PKCS#12格式的,还有PKCS#7格式的,其它还有么?谁知道补充吧...
        ca 命令签发出来的都是X509证书,不过,编码格式可能是DER,也可能是PEM,但是两者其实区别很小,指定的参数看本版ca命令的介绍吧。
        
        Q:大家好:
         我想知道,客户端和服务器在进行SSL/TLS交互的时候,客户端需要自己有些什么证书或是什么东东。
        服务器有些什么证书或是有什么东东?请大家能说的详细些吗?
        谢谢!
        A:首先需要说明的是,SSL/TLS可以不使用证书建立安全信道的,方法是用DH进行密钥交换.
         如果使用证书方式,一般来说,客户端的证书也是可选的.
         如果使用证书,客户端跟服务器端要求的东西应该是一样或差不多的,包括:
         1.客户自己的证书;
         2.客户自己证书相应的私钥;
         3.签发客户证书的CA的根证书以及证书链上的根证书(如果必要)
         4.吊销证书列表CRL(嘿嘿,很多产品没有,安全性大大的得不到保证).
        Q:我现在唯一想知道的是,我如果我想和SERVER进行通讯,但是我们必须在通讯之前
         通过SSL/TLS认证。前提我不能用2层以上的连接,但是我已经 建立MAC层的连接
        但是SERVER把他的证书和相关信息发给我,其中都是二进制码(其中有cerficate request,cerficate和server hello down)我想用OPENSSL中提供的函数处理这些,但是不知道函数的用法及其参数的意义。也就是说我只能用OPENSSL提供
         函数处理证书,而不能用他所提供的连接,而且这个证书已经导入操作系统,是否我还能用OPENSSL的代码?
        
        A:看你的需要了,如果是顶级的根证书,就是说你的CA域是自己建立的,那么你只要给自己签发一个证书就可以了,即自签名根证书,用Req和X509命令都可以实现。如果你需要一个跟其它CA域相联系的证书域(比如CFCA了,changsha很清楚了,呵呵),那么就要向别的CA申请了。
        
        Q:请问班主,用x509怎么样创建一个自签名根证书阿?
        A:openssl x509 -req -in careq.pem -signkey key.pem -out cacert.pem
        其中,key.pem的私钥跟careq.pem里的公钥是相应的。事实上就是使用公钥相应的私钥给公钥所在的CSR签发证书。
    返回 Top

    28、证书是怎样的验证过程

    Q:我想知道验证证书是一个什么样的过程?在验证证书的时候需要一些什么样的参数(例如是否需要私钥的支持)
         还有SSL协议说的那几个过程我们是否能用单独的OPENSSL函数来完成,如果可以我们将使用什么样的函数?能
         具体指出吗?
        A:证书验证的过程其实是一个单独的过程,不需要跟服务器交换信息,只要你得到对方的证书了,那么,你就可以进行验证过程,主要包括签名验证,证书有效期验证,已经证书是否已经吊销(在CRL中),有时候,还要验证证书是否跟服务器声明拥有者一样。整个过程是不需要私钥参与的,但需要签发该证书的CA的证书以及相关的证书链上的根证书。这些都是可以参考X509_verify_cert函数调用的缺省callback函数,要更改认证过程,可以通过更改回调函数实现的。自己好好看看源代码了,X509.c里面我记得是有的。
        此外,你还可以使用下面的代码看看验证出了什么问题:
         verify_error=SSL_get_verify_result(con);
         if (verify_error != X509_V_OK)
         {
         BIO_printf(bio_err,"verify error:%s/n",X509_verify_cert_error_string(verify_error));
         }
    返回 Top

    29、win2000pro下 openssl安装(入门级)

        此文得到了DragonKing、prgstation、adylee、soaring、srysky等人的大力支持,在此表示感谢!
         DragonKing 已经写过一篇此类文章。此文仅是更为详细而已,仅仅是希望以后论坛不会再有此类问题出现!
        
         准备工作:
         1 安装vc6.0 路径为默认都为默认路径。
        
         2 下载 ActivePerl-5.8.0.806-MSWin32-x86 并安装
        
         3下载 openssl0.96i 解压到根目录下 。如c:
         (我开始下载的是最新的.97a,但最后编译时候n_pkey.c老是出问题的)
        
         开始安装:完全可以参照斑竹的文章或openssl目录下的install forw in32
        
         1) > perl Configure VC-WIN32
         : 如不成功会有明显提示
         2) > ms/do_ms
         : 推荐使用这种方式,我第一次成功编译就是在这种方式下
         :另外两种方式 如果使用也必须保证本机有编译器才能使用。
         : > ms/do_masm (默认vc 自带的编译器;也也以自己下载安装)
        
         : ms/do_nasm (需要自己下载)
         :
        
        
         3)转到C:/Program Files/Microsoft Visual Studio/VC98/bin目录(默认安装时)下
         执行 vcvars32.bat 以配置环境变量。
        
         4)跳到openssl目录下
         执行> nmake -f ms/ntdll.mak
         :如果编译成功,最后的输出都在out32dll目录下 : 包括可执行文件 、两个dll和两个lib文件。
         :
        
         备注:
         我自己是n次失败之后才最后成功的,下面是我几个主要犯错的地方。
         1)使用ms/do_masm (ms/do_nasm) 方式时,要保证环境变量path 包含的几种路径下有其可执行文件。
         否则就会出现 如下错误:
        
         Building OpenSSL
         ml /Cp /coff /c /Cx /Focrypto/md5/asm/m5_win32.obj ./crypto/md5/asm/m5_w
         in32.asm
        
         'ml' 不是内部或外部命令,也不是可运行的程序
         或批处理文件。
         NMAKE : fatal error U1077: 'ml' : return code '0x1'
         Stop.
        
         最简单的办法是将可执行文件拷贝到path指定的目录。
         不过用ms/do_ms就可以绕开这样的问题。我开始老是试着用ms/do_masm ,太折磨人。
         2)同一个解压包,如果最后编译没有成功的话,最好是再完全解压重来。
         尤其是你用不同的ms/do_(masm,nasm,ms)方式时.
         3)编译不成功时,一定要注意看看其最后的错误。
         我在编译过程中出现过:
         ./crypto/asn1/n_pkey.c(106) : error C2370: 'NETSCAPE_PKEY_it' : redefinition; di
         fferent storage class
         ./crypto/asn1/n_pkey.c(103) : see declaration of 'NETSCAPE_PKEY_it'
         NMAKE : fatal error U1077: 'cl' : return code '0x2'
         Stop.
        
         和
         Creating library out32dll/libeay32.lib and object out32dll/libeay32.exp
         md5_dgst.obj : error LNK2001: unresolved external symbol _md5_block_asm_host
         er
         sha1dgst.obj : error LNK2001: unresolved external symbol _sha1_block_asm_dat
         der
         sha1dgst.obj : error LNK2001: unresolved external symbol _sha1_block_asm_hos
         der
         rmd_dgst.obj : error LNK2001: unresolved external symbol _ripemd160_block_as
         st_order
         out32dll/libeay32.dll : fatal error LNK1120: 4 unresolved externals
         NMAKE : fatal error U1077: 'link' : return code '0x460'
         Stop.
        
         甚至是
        
         out of memory cann’t 。。。。。。。。等等
        
         用97a出现第一种错误,我自己看过它的源代码,没有找到重新定义的情况(可能是在其它的c文件里),我
         又下过97b 还是同样的问题,后来在其他的包里复制同名文件(大小相同的)都不行。最后我只好重新下载旧版本的包,最后编译才算通过。
        
         对于链接错误等其它的问题,我自己还没有解决经验。以往大家补充,再有新手上路就不用太费神了!
    返回 Top

    30、在IIS端配置数字证书

         前段时间写了点东西,可是一直不能找到客户端证书,现在又没有时间了,先贴出来,大家一起想想办法,就算为网站做贡献 :)
        
         1. 生成自签名根证书
         openssl req -x509 -newkey rsa:1024 -keyout cakey.pem -out cacert.pem -days 3650 -config e:/openssl/apps/openssl.cnf
         输入下列信息:
         PEM pass phrase:也就是密码,输入后牢记。
         然后需要输入下列信息:
         Country Name: CN //两个字母的国家代号
         State or Province Name: guang dong //省份名称
         Locality Name: guang zhou //城市名称
         Organization Name: sunrising //公司名称
         Organizational Unit Name: home //部门名称
         Common Name: besunny //你的姓名(要是生成服务器端的证书一定要输入域名或者ip地址)
         Email Address: be-sunny@163.com Email地址
        
         把cakey.pem 拷贝到out32dll/demoCA/private, 把cacert.pem拷贝到out32dll/demoCA
         注: 我用的是openssl提供的openssl.cnf,openssl.exe所在目录为out32dll
        
         2.用IIS WEB SERVER产生一个证书申请certreq.txt
         打开IIS WEB SERVER——〉站点属性——〉目录安全性——〉服务器证书——〉创建一个新证书——〉现在准备请求,但稍候发送——〉
         命名和安全设置:名称:server,位长:1024
         组织信息:组织:sunrising,组织部门:home
         站点的公用名称:网站名称(或者服务器端的ip)
         地理信息:国家:CN,省市:guang dong,市:guang zhou(注意一定要与先前的根证书相同,否则签名的时候会出错误)
         生成certreq.txt。
         把certreq.txt拷贝到out32dll所在目录
        
         3. 用自己的CA对证书申请签名。
         openssl ca -in certreq.txt -out server.pem –config e:/openssl-0.9.6h/apps/openssl.cnf
         把pem格式证书转化为x509格式
         openssl x509 -in server.pem -out server.cer
         4.导入服务器证书
         打开IIS WEB SERVER——〉站点属性——〉目录安全性——〉服务器证书——〉处理挂起并安装证书——〉选择生成的server.cer
         5.生成客户端证书
         openssl req -newkey rsa:1024 -keyout clikey.pem -out clireq.pem -days 365 –config e:/openssl-0.9.6h/apps/openssl.cnf
         输入下列信息:
         PEM pass phrase:也就是密码,输入后牢记。
         然后需要输入下列信息:
         Country Name: CN //两个字母的国家代号
         State or Province Name: guang dong //省份名称
         Locality Name: guang zhou //城市名称
         Organization Name: sunrising //公司名称
         Organizational Unit Name: home //部门名称
         Common Name: client //你的姓名(要是生成服务器端的证书一定要输入域名或者ip地址)
         Email Address: be-sunny@openssl.cn Email//地址
         a chanllenge password:123456//证书保护密码
         an optional company name:sunrising//
         签名:
         openssl ca -in clireq.pem -out client.crt –config e:/openssl-0.9.6h/apps/openssl.cnf
         生成pkcs12格式的证书
         openssl pkcs12 -export -clcerts -in client.crt -inkey clikey.pem -out client.p12
         安装信任的根证书
         把cacert.pem改名为cacert。cer,在client端的IE中使用"工具 ' Internet
         选项 ' 内容 ' 证书 ' 导入"把
         我们生成的CA根证书导入,使其成为用户信任的CA。
         安装个人证书
         把client.p12导入到client端的IE中作为个人证书
        
         全过程结束。
        
        ----------------------------------
        作者:prgstation
        发表时间:2003-5-22 22:59:29
        
         问题是你的证书链装好了吗?包括客户端和服务器端,我见你的操作步骤中好像没有服务器端安装证书链的步骤,要注意,由于IIS是作为服务运行的,所以服务器端安装证书链的时候要装到LocalMachine用户中。
        ----------------------------------
        
        
        
        作者:redyujulia
        发表时间:2003-6-3 14:55:48
        
         我也是同样的过程,出现了同样的问题--客户端验证时找不到导入的客户端证书!
         这到底怎么回事呢?请高手指点指点
        ----------------------------------
        
        
        
        作者:DragonKing
        发表时间:2003-6-3 18:39:43
        
         besunny辛苦了~~~,提一点小建议(不过可能你已经做过,我没有测试环境):在IE选项->内容->证书->在选中证书后的高级选项->证书目的->选中“客户端认证”选项没有?
        ----------------------------------
        作者:DragonKing
        发表时间:2003-6-4 10:17:15
        
         证书链是一系列证书的有序组合,不一定是PKCS7格式的,一般自己组成,详细的可以参考“资料下载”中一个例子。
        ----------------------------------
        
        
        
        作者:besunny
        发表时间:2003-6-4 11:30:14
        修改文章
         老大,我试过,不行的。我觉得可能是还是客户端的问题,可以去下载一个客户端证书,然后试试。
        ----------------------------------
        我想超越这平凡的生活,注定现在暂时漂泊,无法停止我内心的狂热,对未来的执著,执着。。。。。。
        
        
        作者:great_wjw
        发表时间:2003-6-4 15:17:43
        
         这个问题我已经解决了,哈哈
         先说明解决方法:
         这还是服务器端的问题
         服务器端的根证书必须mmc中导入
         运行mmc程序,添加证书管理单元,在信任的根证书中导入你现在用的根证书
         这样客户端证书在客户端访问的时候,就可以出现了
         主要原因是以前导入的时候,是用户方式导入
         现在在mmc中是以计算机用户方式导入,呵呵
         有问题和我联系 qq28890805
        ----------------------------------
        PKI SSL
    返回 Top

    31、流媒体如何防止盗链

    防止盗链是所有流媒体网站的大问题,小弟试着总结一下:

    1.对于很多的免费流媒体服务网站,是依赖广告生存的,盗链简直和偷窃差不多,但是,我们可以在视频里加入广告,这样别人盗链相当于给你做宣传:) REAL 和 WinMedia 都有不错的广告方案
    --这个算是釜底抽薪的一招

    2.使用没有菜单的弹出式IE窗口,禁止鼠标右键,避免别人察看HTML源代码
    --这个的确可以唬住很多人,但是使用OE之类的离线浏览器或者QQ/MyIE之类的多窗口浏览器可以轻松破解这种方式的加密,这个只能作为其他方法的辅助

    3.使用javascript/vbs运算来得到 视频的URL ,然后使用工具对 Script 编码,让人难以看懂
    --这个的破解的确比上面难了一点,但是客户端的加密始终是靠不住的,别人可不可以看到原始URL只是在于他是否愿意花这个精力而已

    4.使用自定义的ActiveX控件封装Media/REAL播放控件,对传入的URL加密,这样通过察看HTML代码是看不到URL了。
    --可以在InterNet上使用的ActiveX需要一个签名和许可,需要nK的银子,而且,这种方式逃不过Sniffer工具的法眼,特别是现在有工具加入了对Sniffer的支持(比如hiDownLoad)

    上面说的都是防止客户看到流媒体的URL,现在我们换一个思路,让盗链者得到了也没有多少用:

    5.使用认证:观看节目需要用户名和密码,定期的更换用户名和密码,在论坛上发布
    --这个的确让盗链的网站麻烦多了,但是对正常观看的用户也有影响,而且用户和密码难于管理
    --补充:REAL可以把认证信息放在数据库里,这样通过二次开发,可以弥补上面的缺点

    6.使用播放器绑定,现在的Real和WinMedia9播放器都有全球唯一的GUID,通过服务端的二次编程,纪录合法用户的信息(通过二次开发,使这个这个纪录过程只有在你的网站的协助下才能完成),只有已经记录的播放器才可以观看节目,这种方式比较适合于计费
    --但是这个方式的局限也很大,而且需要二次开发

    7.定期变化文件名或者文件路径,或者是服务端口,这个给媒体文件管理带来麻烦(假如手工做这个就更加麻烦了),不过还是有人用的,不适合大型站点

    下面的方式都是比较成熟和实用的方法:

    8.使用动态URL: URL是不断变化的,每次点播的URL都不同,客户只能从网页上得到URL,使用一次或者一个时间段,比如广东世纪前线:
    mmst://218.30.8.11/vod1/movie/miss_du_shi_niang.wmv?str=29b797c438532b1ed8a099dd6a1c7cc2 这个是播放某个节目的url,后面的字符串,要么每次登陆都变化,要么随时间变化,要么一次一个,就算copy了这个URL,换了场景(机器,时间,IP等),也是无法播放
    --这个需要服务器端的二次开发:Real/WinMedia都提供了相应的SDK

    9.使用cookie,这个可以做到防止盗连和下载,可以因为cookie的局限性,流媒体服务器只能和web在一台机器上(没有测试过,理论上是如此的)

    最后:

    9.DRM
    这个不用多说了,最终的解决之道
    WinMediaDRM是免费的(需要公司和个人的电子证书),REAL的也调整了策略,最近大降价,好像对合作伙伴免费了

    但是道高一尺,魔高一丈,大家一定还有关于破解和防止破解更好的方法,欢迎大家继续讨论这个话题

    这里给个链接,大家可以看看下载的各种手段:)
    http://www.pconline.com.cn/pcedu/soft/wl/ftp/0312/265447.html

    返回 Top

    32、DRM数字加密技术

      数字版权保护(DRM,Digital Rights Manager)
      数字版权保护是实现数字信息产品通过网络销售的前提条件,采用数字版权保护技术可有效地杜绝通过网络和计算机非法复制、拷贝、传送数字信息产品。公司的"宽带增值业务应用平台"实现了全面的"数字版权保护"功能,充分的保护了数字信息产品版权所有者的合法利益,数字版权保护功能如下:
      数字版权管理(Digital Rights Manager)服务器软件是一个端到端的数字版权管理系统,实现一个可扩展的平台用来安全地分发数字产品。使用版权管理,可以安全地在网络上传递音乐、录像和其他数字信息产品,消费者可以非常容易的获得合法地数字内容,并维护版权所有者的权益。
      数字版权管理系统保护数字信息产品不受下列行为的攻击:
      □ 用户未经授权,通过欺骗或解密的方式在线收看或离线播放流媒体内容。
      □ 授权用户将数字内容以未经保护的形式保存或分发。
      □ 用户对数字内容进行许可证限制范围之外的操作。
      □ 授权用户将自己的许可证提供给他人使用。
      □ 实现在线版权保护和下载数字版权保护两种方式。
      对用户操作的限制可包括:
      □ 播放时间限制(播放许可证的生效日期和失效日期)。
      □ 播放次数限制。
      □ 许可证与用户使用的硬件环境绑定。

      认证计费技术
      认证计费技术是一整套数字信息产品计费、认证、收费、报帐的用户付款结算系统,只有实现安全可靠、方面快速的付款结算系统才能保证数字信息产品的经营,保证企业与消费者共同的利益,公司的"宽带增值业务应用平台"中实现的计费认证功能如下:
      □ 可以自主的、根据不同类型的数字信息产品和不同的分类,以及其他一些数字信息产品的属性信息来设定不同的价格体系标准(收费体系标准),目前可以实现的收费形式包括:免费、月租费、时间卡予付费、按次点收付费、按数量购买收费、打包/套餐收费,同时,也可以按带宽、数字产品类型、档次等条件设定收费体系。
      □ 支持对特定时段、特定用户的优惠节目折扣定义(时间段、双休日)。特殊用户折扣定义(点播常客)。用户缴费管理(修改用户帐户余额、设置用户按月访问的权限)。实现按时段优惠、假日优惠、内容优惠、特定用户群优惠等。
      □ 用户费用查询,修改功能
      □ 建立数字产品的计费、帐务、收费系统,并提供相关经营报表。计费帐务处理系统包括计费数据的分拣、出帐、销帐、查询、结算处理等,支持银行托收功能、网上电子商务方式的缴费功能。
      □ 从认证和数据采集系统获得原始的计费数据,和用户管理系统结合,对用户信用的控制实时化、个性化,既有效控制欠费,又鼓励用户消费。
      □ 提供发票管理功能。与内容提供商之间的结算,版权结算等。对客户服务系统提供收费清单接口。
      □ 可以实现基于流和基于服务的用户认证,基于流认证是用户在同某个流建立TCP/IP连接时产生的系统认证,是最可靠的认证,基于服务的认证是在用户选择具体的功能时所进行的WEB认证明,是系统的入口认证.
    计费统计(或计次统计):


    返回 Top

    33、网站规划书写作

      一个网站的成功与否与建站前的网站规划有着极为重要的关系。在建立网站前应明确建设网站的目的,确定网站的功能,确定网站规模、投入费用,进行必要的市场分析等。只有详细的规划,才能避免在网站建设中出现的很多问题,使网站建设能顺利进行。

      网站规划是指在网站建设前对市场进行分析、确定网站的目的和功能,并根据需要对网站建设中的技术、内容、费用、测试、维护等做出规划。网站规划对网站建设起到计划和指导的作用,对网站的内容和维护起到定位作用。

       网站规划书出应该尽可能涵盖网站规划中的各个方面,网站规划书的写作要科学、认真、实事求是。

       网站规划书包含的内容如下:

    一、建设网站前的市场分析

    1、相关行业的市场是怎样的,市场有什么样的特点,是否能够在互联网上开展公司业务。
    2、市场主要竞争者分析,竞争对手上网情况及其网站规划、功能作用。
    3、公司自身条件分析、公司概况、市场优势,可以利用网站提升哪些竞争力,建设网站的能力(费用、技术、人力等)。

    二、建设网站目的及功能定位

    1、为什么要建立网站,是为了宣传产品,进行电子商务,还是建立行业性网站?是企业的需要还是市场开拓的延伸?
    2、整合公司资源,确定网站功能。根据公司的需要和计划,确定网站的功能:产品宣传型、网上营销型、客户服务型、电子商务型等。
    3、根据网站功能,确定网站应达到的目的作用。
    4、企业内部网(Intranet)的建设情况和网站的可扩展性。

    三、网站技术解决方案

    根据网站的功能确定网站技术解决方案。
    1、采用自建服务器,还是租用虚拟主机。
    2、选择操作系统,用unix,Linux还是Window2000/NT。分析投入成本、功能、开发、稳定性和安全性等。
    3、采用系统性的解决方案(如IBM,HP)等公司提供的企业上网方案、电子商务解决方案?还是自己开发。
    4、网站安全性措施,防黑、防病毒方案。
    5、相关程序开发。如网页程序ASP、JSP、CGI、数据库程序等。

    四、网站内容规划

    1、根据网站的目的和功能规划网站内容,一般企业网站应包括:公司简介、产品介绍、服务内容、价格信息、联系方式、网上定单等基本内容。
    2、电子商务类网站要提供会员注册、详细的商品服务信息、信息搜索查询、定单确认、付款、个人信息保密措施、相关帮助等。
    3、如果网站栏目比较多,则考虑采用网站编程专人负责相关内容。 注意:网站内容是网站吸引浏览者最重要的因素,无内容或不实用的信息不会吸引匆匆浏览的访客。可事先对人们希望阅读的信息进行调查,并在网站发布后调查人们对网站内容的满意度,以及时调整网站内容。

    五、网页设计

    1、网页设计美术设计要求,网页美术设计一般要与企业整体形象一致,要符合CI规范。要注意网页色彩、图片的应用及版面规划,保持网页的整体一致性。
    2、在新技术的采用上要考虑主要目标访问群体的分布地域、年龄阶层、网络速度、阅读习惯等。
    3、制定网页改版计划,如半年到一年时间进行较大规模改版等。

    六、网站维护

    1、服务器及相关软硬件的维护,对可能出现的问题进行评估,制定响应时间。
    2、数据库维护,有效地利用数据是网站维护的重要内容,因此数据库的维护要受到重视。
    3、内容的更新、调整等。
    4、制定相关网站维护的规定,将网站维护制度化、规范化。

    七、网站测试

    网站发布前要进行细致周密的测试,以保证正常浏览和使用。主要测试内容:
    1、服务器稳定性、安全性。
    2、程序及数据库测试。
    3、网页兼容性测试,如浏览器、显示器。
    4、根据需要的其他测试。

    八、网站发布与推广

    1、网站测试后进行发布的公关,广告活动。
    2、搜索引掣登记等。

    九、网站建设日程表

    各项规划任务的开始完成时间,负责人等。

    十、费用明细

    各项事宜所需费用清单。

      以上为网站规划书中应该体现的主要内容,根据不同的需求和建站目的,内容也会在增加或减少。在建设网站之初一定要进行细致的规划,才能达到预期建站目的。

    返回 Top

    34、"打开,另存为,属性,打印"等14个JS代码

    ■打开■ 
    <input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开> 
    <OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
    ■另存为■ 
    <input name=Button onClick=document.all.WebBrowser.ExecWB(4,1) type=button value=另存为><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
    ■属性■ 
    <input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value=属性><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
    ■打印■ 
    <input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value=打印><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
    ■页面设置■ 
    <input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value=页面设置><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT> 
    ■刷新■ 
    <input type=button value=刷新 name=refresh οnclick="window.location.reload()"> 
    ■导入收藏■ 
    <input type="button" name="Button" value="导入收藏夹" onClick=window.external.ImportExportFavorites(true,);> 
    ■导出收藏■ 
    <input type="button" name="Button3" value="导出收藏夹" onClick=window.external.ImportExportFavorites(false,);> 
    ■加入收藏■ 
    <INPUT name=Button2 οnclick="window.external.AddFavorite(location.href, document.title)" type=button value=加入收藏夹> 
    ■整理收藏夹■ 
    <INPUT name=Submit2 οnclick="window.external.ShowBrowserUI(OrganizeFavorites, null)" type=button value=整理收藏夹> 
    ■查看原文件■ 
    <INPUT name=Button οnclick=window.location = "view-source:" + window.location.href type=button value=查看源文件> 
    ■语言设置■ 
    <INPUT name=Button οnclick="window.external.ShowBrowserUI(LanguageDialog, null)" type=button value=语言设置> 
    ■前进■ 
    <INPUT name=Submit οnclick=history.go(1) type=submit value=前进> 
    ■后退■ 
    <INPUT name=Submit2 οnclick=history.go(-1) type=submit value=后退>

    返回 Top

    版权声明:本文为ningxd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    THE END
    < <上一篇
    下一篇>>