CGI编程的COOKIE技术应用

CGI编编程的CCOOKKIE技技术应用用 我们们在一些些留言本本、BBBS讨论论区发贴贴时常会会出现这这种现象象:当进进入发贴贴界面时时在要求求填写用用户名和和密码的的地方就就已经自自动地填填上了你你的资料料这是是什么会会事呢??这是因因为程序序中引入入了COOOKIIE技术术的缘故故原来来在你第第一次登登录时,程程序就已已在你的的电脑中中安装了了一个CCOOKKIE信信息包,在在你今后后登陆时时电脑就就自动检检索你的的COOOKIEE并取出出信息包包的信息息供程序序调用,所所以出现现上面所所述的现现象CCOOKKIE只只不过是是CGII程序要要求浏览览器持有有的一个个信息包包,这个个信息包包可以由由CGII程序在在任何时时候收回回每当当CGII程序要要求创建建COOOKIEE时,CCOOKKIE可可以从服服务器传传送到浏浏览器所所属的子子目录下下(通常常是保存存在C::\WIINDOOWS\\Temmporraryy Innterrnett Fiiless的目录录下,这这个过程程称为CCOOKKIE的的安装 COOKIE的安装和读出通常都由一个CGI模块来完成,下面我就将此模块的原代码公布给大家,有了这个COOKIE模块我们在编写程序时如要应用COOKIE技术可以说易如反掌。
cookie的语法: http cookie的发送是通过http头部来实现的,他早于文件的传递,头部set-cookie的语法如下: Set-cookie:name=name;expires=date;path=path;domain=domain;secure name=name: 需要设置cookie的值(name不能使用“;”和","号),有多个name值时用";"分隔例如:name1=name1;name2=name2;name3=name3expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS" path=path: 设置cookie支持的路径,如果path是一个路径,则cookie对这个目录下的所有文件及子目录生效,例如:path="/cgi-bin/",如果path是一个文件,则cookie指对这个文件生效,例如:path="/cgi-bin/cookie.cgi"domain=domain: 对cookie生效的域名,例如:domain=""secure: 如果给出此标志,表示cookie只能通过SSL协议的https服务器来传递。
cookie的接收是通过设置环境变量HTTP_COOKIE来实现的,CGI程序可以通过检索该变量获取cookie信息 以下是一个cookie的模块,可以为你编写程序带来方便 $Cookie_Exp_Date = '';#此处设置cookie的有效时间$Cookie_Path = '';#此处设置cookie的有效路径,默认脚本存在的目录Cookie_Domain = ''; #此处设置cookie的有效域名,默认脚本调用的域名Secure_Cookie = '0';@Cookie_Encode_Chars = ('\%', '\+', '\;', '\,', '\=', '\&', '\:\:', '\s');%Cookie_Encode_Chars = ('\%', '%25','\+', '%2B','\;', '%3B','\,', '%2C','\=', '%3D','\&', '%26','\:\:', '%3A%3A','\s', '+');# 特殊字符的解码@Cookie_Decode_Chars = ('\+', '\%3A\%3A', '\%26', '\%3D', '\%2C', '\%3B', '\%2B', '\%25');%Cookie_Decode_Chars = ('\+', ' ','\%3A\%3A', '::','\%26', '&','\%3D', '=','\%2C', ',','\%3B', ';','\%2B', '+','\%25', '%');# 特殊字符的解码#########获取cookie信息子程序#####################sub GetCookies {local(@ReturnCookies) = @_;local($cookie_flag) = 0;local($cookie,$value);if ($ENV{'HTTP_COOKIE'}) {if ($ReturnCookies[0] ne '') {foreach (split(/; /,$ENV{'HTTP_COOKIE'})) {#分割HTTP_COOKIE变量的字符串($cookie,$value) = split(/=/);foreach $char (@Cookie_Decode_Chars) {$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;#调用转码函数$value =~ s/$char/$Cookie_Decode_Chars{$char}/g;#调用转码函数}foreach $ReturnCookie (@ReturnCookies) {if ($ReturnCookie eq $cookie) {$Cookies{$cookie} = $value;$cookie_flag = "1";}}}}else {foreach (split(/; /,$ENV{'HTTP_COOKIE'})) {($cookie,$value) = split(/=/);foreach $char (@Cookie_Decode_Chars) {$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;$value =~ s/$char/$Cookie_Decode_Chars{$char}/g;}$Cookies{$cookie} = $value;}$cookie_flag = 1;}}return $cookie_flag;}########## 设置Cookie信息子程序#######################sub SetSecureCookie {if ($_[0] =~ /^[01]$/) {$Secure_Cookie = $_[0];return 1;}else {return 0;}}sub SetCookies {local(@cookies) = @_;local($cookie,$value,$char);while( ($cookie,$value) = @cookies ) {foreach $char (@Cookie_Encode_Chars) {$cookie =~ s/$char/$Cookie_Encode_Chars{$char}/g;#调用转码函数$value =~ s/$char/$Cookie_Encode_Chars{$char}/g;#调用转码函数}print 'Set-Cookie: ' . $cookie . '=' . $value . ';';#设置cookie值if ($Cookie_Exp_Date) { print ' expires=' . $Cookie_Exp_Date . ';'; }#设置有效时间if ($Cookie_Path) { print ' path=' . $Cookie_Path . ';'; }#设置有效路径if ($Cookie_Domain) { print ' domain=' . $Cookie_Domain . ';'; }#设置有效域名if ($Secure_Cookie) { print ' secure'; }print "\n";shift(@cookies); shift(@cookies);}}sub SetCompressedCookies {local($cookie_name,@cookies) = @_;local($cookie,$value,$cookie_value);while ( ($cookie,$value) = @cookies ) {foreach $char (@Cookie_Encode_Chars) {$cookie =~ s/$char/$Cookie_Encode_Chars{$char}/g;$value =~ s/$char/$Cookie_Encode_Chars{$char}/g;}if ($cookie_value) { $cookie_value .= '&' . $cookie . '::' . $value; }else { $cookie_value = $cookie . '::' . $value; }shift(@cookies); shift(@cookies);}&SetCookies("$cookie_name","$cookie_value");}sub GetCompressedCookies {local($cookie_name,@ReturnCookies) = @_;local($cookie_flag) = 0;local($ReturnCookie,$cookie,$value);if (&GetCookies($cookie_name)) {if ($ReturnCookies[0] ne '') {foreach (split(/&/,$Cookies{$cookie_name})) {($cookie,$value) = split(/::/);foreach $char (@Cookie_Decode_Chars) {$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;$value =~ s/$char/$Cookie_Decode_Chars{$char}/g;}foreach $ReturnCookie (@ReturnCookies) {if ($ReturnCookie eq $cookie) {$Cookies{$cookie} = $value;$cookie_flag = 1;}}}}else {foreach (split(/&/,$Cookies{$cookie_name})) {($cookie,$value) = split(/::/);foreach $char (@Cookie_Decode_Chars) {$cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;$value =~ s/$char/$Cookie_Decode_Chars{$char}/g;}$Cookies{$cookie} = $value;}$cookie_flag = 1;}delete($Cookies{$cookie_name});}return $cookie_flag;}########结束#################下面是cookie信息包安装代码段###########结束#####################下面是读取信息包代码,很简单:&GetCookies;$name=$Cookies{'username'};$pass=$Cookies{'password'};本站用的的“BBBS讨论论区”程程序和本本人写的的“会员员管理”程程序就采采用了此此模块。
思维稿MYSQQL数据据库的使使用方法法 现在在网上有有很多交交互式的的程序如如BBSS、留言言本等都都使用PPHP来来编写,而而PHPP是支持持MYSSQL数数据库的的,因此此很多人人在用PPHP编编程时都都使用MMYSQQL数据据库最最近有一一个网友友送给我我一份用用PHPP+MYYSQLL编写的的留言本本程序,在在这里我我将在调调试此程程序的体体会讲一一下(重重点是MMYSQQL数据据库部分分),希希望能对对喜欢PPHP++MYSSQL的的朋友提提供有用用的参考考 此此程序由由4个文文件组成成,一个个是显示示贴子的的子程序序,一个个是贴子子输入程程序,一一个是产产生框架架结构页页面的HHTM文文件,一一个是数数据库结结构文本本文件要要使用此此程序,你你的空间间必须要要支持PPHP和和MYSSQL数数据库,我我现在使使用的空空间是由由WWWW.511.NEET所提提供的满满足上述述要求安安装此程程序的第第一步是是要安装装程序所所用的数数据库,要要成功生生成一个个数据库库你必须须要知道道你的MMYSQQL服务务器的主主机名、密密码、和和在MYYSQLL服务器器中分配配给你使使用的数数据库目目录名,这这些参数数都由IISP商商提供给给你,然然后用文文本编辑辑器编写写一个数数据库结结构的一一般文本本文件,格格式如下下:设你你的主机机名是::loccalhhostt;密码码是:1123445;用用户名::gzddzw;;数据库库目录名名:teest## 数据据表的结结构表 'caatv''#CREEATEE TAABLEE caatv (idd innt(111) NOTT NUULL autto_iincrremeent,,maiil vvarccharr(600),hhomee vaarchhar((60)),coonteent texxt,rreplly ttextt,aaaa vvarccharr(200),iip vvarccharr(2555),,repplyddatee vaarchhar((2555),ddatee vaarchhar((2555),nnamee vaarchhar((10)),PRRIMAARY KEYY (iid)));接着着用phhpMyyAdmmin程程序(此此程序是是一个专专门针对对MYSSQL数数据库而而编写的的PHPP程序,它它可对MMYSQQL数据据库进行行包括::数据库库的生成成、数据据库结构构的修改改、字段段的修改改、数据据的删除除、数据据库结构构和数据据的导出出和导入入等操作作,是使使用MYYSQLL的必备备工具程程序。
此此程序在在网上有有很多网网站都提提供免费费下载下下面讲一一讲此程程序的设设置:找找到此程程序下的的文件::connfigg.innc.pphp,修修改其中中的$ccfgSServverss[1]]['hhostt'] = ''loccalhhostt'; // 你的主主机名$$cfggSerrverrs[11][''porrt']] = '';; /// 端口口设置,空空为默认认值可不不作修改改$cffgSeerveers[[1][['addv_aauthh'] = ffalsse; // 出错处处理,ffalsse是默默认值可可不修改改ccfgSServverss[1]]['sstduuserr'] = ''rooot';; /// MYYSQLL默认用用户名$$cfggSerrverrs[11][''stddpasss']] = '';; /// MYYSQLL默认用用户密码码(一般般为空)$cfgServers[1]['user'] = 'gzdzw'; // MySQL指定使用者的用户名$cfgServers[1]['password'] = '12345'; // MySQL指定使用者的密码$cfgServers[1]['only_db'] = 'test'; // 指定使用的数据库目录名$cfgServers[1]['verbose'] = ''; // 指定使用的数据库名然后修改require("english.inc.php");为require("chinese_gb.inc.php");这时程序运行时将显示中文。
修改完毕后,将整个程序用FTP软件上传到你的使用空间,然后运行index.php出现上图的界面,双击左上角的数据库目录名(分配给你的数据库目录名),会出现下图的界面,此时点选“浏览”按钮选取你的库结构文件,然后按“开始”按钮这时程序就自动地将数据库结构导入到MYSQL数据库中并产生一个名为CATV的数据库文件了,OK!此时你就可以调试你的程序了 那末如何在本地机上调试MYSQL的程序呢?很简单只要安装一个MYSQL服务器软件(在网上有下载),再将phpMyAdmin的config.inc.php文件修改一下就万事大吉了本站的“站务论坛”就是应用了MYSQL数据库技术编写的思维稿SMTPP服务器器软件的的设置 ADDR(AAdvaanceed DDireect Remmailler))是一套套专门发发送邮件件的软件件,它能能够更快快、更安安全、简简便地发发送邮件件,通过过它不仅仅能节省省金钱,还还能节省省时间AADR的的主要功功能是在在我们自自己的微微机上建建立一个个本地SSMTPP服务器器,在发发送邮件件时使用用自身的的SMTTP端口口而不需需使用IISP提提供的发发信服务务器,AADR通通过DNNS解析析收件人人的地址址把邮件件直接快快速地发发送到对对方的邮邮件服务务器上。
在在此期间间,由于于不受IISP提提供的SSMTPP服务器器是否拥拥挤的影影响,而而且几乎乎不用转转发服务务器,所所以邮件件发送更更加快速速、更加加安全,而而不会造造成丢信信的现象象,更不不会因为为SMTTP服务务器的关关闭而影影响邮件件的发送送对于于经常使使用E--maiil的广广大网友友来说,不不失为一一种绝好好的选择择下面面,将AADR的的使用方方法详细细介绍给给大家 一、软件的下载和安装 我们可以到 二、软件的使用 软件安装完毕后,会在“程序”组中生成Advanced Direct Remailer项,在桌面上生成快捷图标双击快捷图标执行程序后,软件会退至任务栏托盘内,形成一个蓝色箭头状的小图标右击这个图标,会弹出一个菜单,程序提供的各种功能可以在这个菜单中进行调用 1.ADR的设置: 在右击图标弹出的菜单中选择“General Settings”,弹出设置窗口,在设置窗口中共有八个标签,下面我们分别予以介绍: ●General:在这个标签页中共有八个复选框:“Run program when Windows startup”,如果选中,则表示软件将随系统同时启动;“Show Monitor window always topmost”,如果选中此项,则软件的窗口始终在桌面的最上方,不被其他窗口覆盖;“Delete messages after sending,don't move it in ‘Sent’”,这个选项如果被选中,则发送的邮件信息将被直接删除,而不是放到Sent文件夹中;“Integration with Eserv”,建议选中这个选项,因为Eserv网站是一个集邮件服务器、新闻服务器、代理服务器、Web服务器于一身的服务器,把这个选项选中,软件将会更好地运行;“Beep when message is moved in ‘Bad’”,当发送出现错误并把邮件转移到Bad文件夹中时发声;“Beep when all mail will be sent”,当发送所有邮件时发声(这里提到的发声是通过声卡的外接喇叭发声,而不是通过计算机的小喇叭);“Use message priority in Outbox queue”,如果把此项选中,则在发送邮件时,将首先发送标识为高优先级的邮件;而最后一项“Use delay list”则是过滤垃圾邮件之用。
在这几个选项中,我们可以根据自己的情况灵活选用 ●Actions:在这个标签页中设置邮件的发送情况在“Start delivery”中有三个单选按钮:“Manually throught program menu”表示通过手工发送邮件;“When dial-up connection is established”表示通过指定的连接进行发送,而如果此时连接的名称设定为“Any connection”,则表示只要连接到互联网上就会发送邮件;“Automatically when mail present in Outbox”是给使用专线之类长期在线的用户设置的,自动发送邮件在“Purge old mail”中有两个选项:“In Sent box after several last days”表示如果在“Sent box”(待发信箱)中信件存放超过指定天数,则将其删除,默认是15;“In Bad box after several last days”就表示在“Bad Box”中的信息存放到指定天数时将其删除 ●DNS:ADR需要指定DNS(即域名服务器),它需要通过DNS解析收件人的邮件地址。
这个DNS服务器地址,我们可以向ISP询问,也可以在软件运行时连入互联网,在这个页面内的“Windows DNS setting”下有显示,按显示顺序顺次填入“Primary DNS”(主控DNS)、“Secondary DNS”(辅助DNS)中在该页面内还有两个复选框,一个是“Try to deliver by name to host,if host was not found in DNS”,默认状态下是选中该项,不用更改第二个选项是“Don't use internal DNS cache”,这个选项不要选中因为在发送邮件时,如果不使用DNS cache,则会在每次发送时都要通过DNS进行搜索,即使是向同一个邮件服务器发送邮件也是如此,而如果使用DNS cache,则在向相同的邮件服务器发送邮件时只须DNS解析一次即可,这样能够提高发信速度 ●Proxy:ADR支持Socks5代理服务器,如果我们是通过代理服务器接入互联网,就可以在这个页面里把代理服务器的地址填入,否则不要进行设置 对于其他几个标签页,如Logs、Mailbox等不用设置,软件即可正常工作 2.邮件软件的设置 ADR运行之后,我们自己的微机上就已经开通了一个SMTP服务器,所以在发邮件时再也不用通过ISP提供的SMTP服务器了,那么在收发邮件的软件中该如何进行设置呢? 在Outlook Express 5.0中,我们可以选择主菜单上的“工具”→“账号”,选择“邮件”标签,选中邮件名称,按下“属性”按钮,选择“服务器”标签,在“外发邮件(SMTP)”中输入“localhost”,也就是本机地址,或者填入127.0.0.1,按下“确定”即可。
在FoxMail中,选择主菜单上的“账户”→“属性”,选择“邮件服务器”,在“发送邮件服务器”中填入“localhost” 如果是在局域网中,则需要查询一下安装ADR软件的IP地址(局域网内地址),然后把其他机器邮件软件的发送邮件服务器地址填为这个地址即可 3.邮件的发送 把ADR和邮件软件设置好后,我们就可以通过我们自己的机器向外直接发送邮件了和以前一样,在OE或者FoxMail中撰写好一封邮件,然后按下发送按钮,我们就会看到邮件非常快速地被发送出去但邮件真的被发到了对方的邮件服务器上了吗?不是,邮件首先被发送到ADR构造的SMTP服务器上,此时我们需要右击托盘内的图标,选择“Open Monitor”查看一下 在Monitor界面上我们可以看到三个标签,一个称为“OutBox”,一个是“Sent”,另一个是“Bad”我们在邮件软件中发送的邮件被送到OutBox中待发如果我们在前面设置时把ADR设置为手工发送邮件在这里可以按下“发送”快捷按钮(黑三角形)进行真正的发送邮件,选择主菜单上的“Delivery”-“Run Delivery”也可以完成这个功能发送时,在下面的提示行内会有一个蓝色的进度指示条表示邮件发送的进度,当待发邮件全部发送出去后,OutBox将会被清空。
如果在发送中途想中止或停止发送,可以按下“暂停”按钮或“终止”按钮 发送邮件也可以不打开Monitor程序,而直接右击托盘内的图标,选择“Run Delivery”进行发送,选择“Pause Delivery”暂停,选择“Stop Delivery”终止发送 由于这款软件不经过ISP提供的SMTP服务器,所以发信速度很快,尤其是发送大邮件时更加明显同时,经过ADR发送的邮件直接传输到对方的邮件服务器上,我们在邮件发出后,对方可以马上收到,几乎不存在延迟现象但由于它是一款英文软件,对于一般网友来说在使用过程中稍有困难,好在它的操作、设置都非常简单 CGI聊聊天室程程序的剖剖析 一一般用CCGI编编写的聊聊天程序序其页面面结构均均为框架架式结构构,通常常分为四四个框架架:聊天天区、在在线人员员名单显显示区、发发言区、其其他项目目附加区区这些些区都显显示由CCGI程程序所生生成的四四个不同同的页面面一、发发言区 发言区区其实是是一个普普通表单单页面,根根据功能能的多少少可设置置多个参参数,如如发言者者的表情情、字体体颜色、悄悄悄话、发发言内容容、发言言者的姓姓名等,每每一个功功能都有有一个对对应的变变量,这这些变量量通过提提交按钮钮传给服服务器端端的CGGI程序序进行处处理。
另另外,在在此区内内还可设设置一些些必要的的管理功功能,如如聊天区区的清屏屏、人员员管制(如如踢人功功能)等等功能这这些功能能的提交交方式一一般是用用超连接接方式进进行,即即运行CCGI程程序的相相应模块块来完成成相应的的操作二、在线人员名单显示区 此区主要是显示在线聊天的人员名单,进入聊天室的人员首先需通过一个入口表单,填入如姓名、密码、性别等参数,然后提交到CGI程序,程序就会将此人的这些资料写入到一个在线人员记录文件中,然后利用这条语句对此文件进行定时读取和写入(定时时间可自定),并将读取的数据显示在“在线人员名单显示区”内同时程序还定时地对在线人员是否离线进行检测,如某人已离线,程序将清除此人在人员记录数据文件中的资料三、聊天区 当在发言区按下提交按钮后,表单的所有参数都通过CGI程序写入到一个聊天内容记录文件中,同时也是利用这条语句对此文件进行定时读取和写入,将读取的此记录文件中的内容显示在聊天区内,并写入新的发言内容。
即对聊天内容记录文件进行不断的定时刷新 四、其他项目附加区 此区一般都是放置一些作者信息或其他的辅助功能 综上所述,聊天室程序一般由六大块模块所组成:1、入口登陆信息处理模块2、发言表单生成模块3、在线人员读写显示模块4、聊天内容读写显示模块5、框架页面生成模块6、基本设置模块 从以上分析可知,程序在运行时要不断地对记录文件进行读写,这严重地耗费服务器的资源,使服务器运行其他程序的速度变慢,难怪ISP商们都严禁将这种聊天程序放在普通服务器上运行 本人编写的CGI聊天程序就以此思路进行编写的,初学CGI编程的朋友可随意下载回去作为学习参考思维稿CGI程程序运行行时数据据丢失的的改进 在用用PERRL写的的CGII程序在在运行当当中,常常常会发发生数据据文件丢丢失的问问题,如如本站的的浏览计计数程序序就曾经经发生过过多次数数据丢失失的情况况这是是什么原原因呢??据我分分析,数数据丢失失是发生生在多个个用户对对数据文文件进行行操作时时在程程序中对对数据文文件中的的数据更更新的程程序通常常如下::openn(ree,"ttj.ttxt"");##设此时时tj..txtt文件里里面的数数据为1100$a=<
如如两个人人在一定定的时间间差内执执行以上上程序,当当第一个个人执行行完oppen((WR,,">ttj.ttxt"");这这一语句句(注意意此时ttj.ttxt数数据文件件已经被被清空),这这个时候候第二个个人刚好好跟着执执行这一一语句,有有于数据据文件里里面的数数据是空空的,那那么变量量a的值值为零,当当后者执执行完整整个进程程后,显显而易见见,数据据文件里里面的数数据为11综观观整个进进程,造造成数据据丢失的的关键语语句是oopenn(WRR,">>tj..txtt");; 针对以以上问题题,有两两种改进进方法::1、给数数据文件件加锁,即即当某一一进程打打开数据据文件后后,马上上对这一一数据文文件加锁锁,防止止了其他他进程使使用它在在完成了了对数据据文件的的操作后后,才对对数据文文件解锁锁,释放放给其他他进程使使用加加锁语句句:fllockk(WRR,1)),只要要将此语语句放到到opeen(WWR,"">tjj.txxt"))的下面面即可,当当进程执执行完cclosse(WWR)语语句后,将将自动解解锁此此语句只只能在UUNIXX和WIINDOOWS NT系系统下使使用。
2、将oopenn(WRR,">>tj..txtt")语语句改成成opeen(WWR,""+〈ttj.ttxt""),在在执行此此语句时时,并不不清空数数据文件件里面的的数据,从从而防止止了数据据丢失。