要讀懂這些代碼主要是要了解ASP中操作二進(jìn)制數(shù)據(jù)的對(duì)象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有這個(gè)基礎(chǔ),就可以進(jìn)一步添加更多的功能如加入雜點(diǎn),漸變底色,數(shù)字行列錯(cuò)位,筆畫短點(diǎn),提高被ocr識(shí)別的不可能。目前還沒有好的識(shí)別引擎,昨天下載了個(gè)號(hào)稱能識(shí)別圖像驗(yàn)證碼90%的!把4321識(shí)別成 89910,所以圖像碼還是比較安全的。
在網(wǎng)上看到有暴力破解的方法,如果我用圖像附加碼+禁止外部提交+10次密碼錯(cuò)誤封帳號(hào) +50次密碼錯(cuò)誤瑣死IP+10秒的防刷新間隔注冊(cè)頁,登陸頁均要加上+禁止外部提交,這樣,暴力破解應(yīng)該就沒戲了。
Asp文件:Code.Asp
數(shù)據(jù)文件:body.Fix , Head.Fix
用法:<img src="code.asp">
Response.buffer = true
NumCode
Function NumCode()
Response.Expires = -1
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-ctrol","no-cache"
dim zNum,i,j
dim Ados,Ados1
Randomize timer
生成隨機(jī)四位數(shù)字:
zNum = cint(8999*Rnd+1000)
傳遞給session
Session("GetCode") = zNum
該for循環(huán)是將隨機(jī)數(shù)字放入一個(gè)下標(biāo)3的數(shù)組,便于提供給后面的陣列變換
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
dim Pos
'定義二個(gè) ADODB.Stream binary對(duì)象,作圖像數(shù)據(jù)操作之用:
set Ados=Server.CreateObject("Adodb.Stream")
Ados.Mode=3
Ados.Type=1
Ados.Open
set Ados1=Server.CreateObject("Adodb.Stream")
Ados1.Mode=3
Ados1.Type=1
Ados1.Open
'載入0~9的數(shù)字?jǐn)?shù)據(jù)10x100的,Gbr的陣列數(shù)據(jù),每個(gè)320字節(jié),10個(gè)數(shù)字3200byte
'BGR一個(gè)點(diǎn),10x10個(gè)點(diǎn)一個(gè)數(shù)字,一個(gè)點(diǎn)三個(gè)字節(jié)(二進(jìn)制8位,16進(jìn)制 00~FF)
'一行10個(gè)點(diǎn) 30字節(jié) + 行結(jié)束標(biāo)記 00 00 二字節(jié) 32字節(jié),所以一個(gè)10x100寬小于長的圖像每個(gè)數(shù)字10x10是320字節(jié)
'長大于寬的則無行結(jié)束標(biāo)記 0000,直接是300字節(jié)
這些就是BMP 24bit的數(shù)據(jù)詳細(xì)信息了
‘至于頭部,也很簡(jiǎn)單,包含長寬,圖像開始標(biāo)記等等~~才54字節(jié),遠(yuǎn)沒jpg什么的復(fù)雜
Ados.LoadFromFile(Server.mappath("body.Fix"))
Ados1.write Ados.read(1280)
'第一個(gè)for循環(huán),按生成的隨機(jī)數(shù)字順序從 10X100的數(shù)字陣列中提取出相應(yīng)的四個(gè)數(shù)字
但是豎排的數(shù)字陣列
for i=0 to 3
Ados.Position=(9-zimg(i))*320
Ados1.Position=i*320
Ados1.write ados.read(320)
next
'清空已經(jīng)用完的ADOS的數(shù)據(jù),調(diào)入替換新的圖像頭54字節(jié)的頭文件
Ados.LoadFromFile(Server.mappath("head.fix"))
Pos=lenb(Ados.read())
Ados.Position=Pos '指定Pos位置,即可再偏移54字節(jié)的位置添加圖形數(shù)據(jù)
第二個(gè)for循環(huán),進(jìn)行數(shù)字的陣列變換,由豎排的塊轉(zhuǎn)換為橫排的數(shù)字塊
方法是隔320字節(jié)抽取4次30字節(jié)寫入ados對(duì)象,再抽取偏移第二行的圖像數(shù)據(jù)
30字節(jié)是因?yàn)閎mp 寬大于長時(shí)無00 00的行結(jié)束標(biāo)記
for i=0 to 9 step 1
for j=0 to 3
Ados1.Position=i*32+j*320
Ados.Position=Pos+30*j+i*120
Ados.write ados1.read(30)
next
next
Ados.Position=0
response.BinaryWrite直接向客戶端發(fā)送圖像數(shù)據(jù)
Response.ContentType = "image/BMP"
Response.BinaryWrite Ados.read()
Ados.Close:set Ados=nothing
Ados1.Close:set Ados1=nothing
End Function
每一個(gè)程序語言或開發(fā)工具都有一定的函數(shù)與用戶進(jìn)行溝通,Asp同樣如此。在Asp中負(fù)責(zé)將信息傳遞給用戶的對(duì)象就是Response對(duì)象。Response對(duì)象用于動(dòng)態(tài)響應(yīng)客戶端請(qǐng)求(Request),并將動(dòng)態(tài)生成的響應(yīng)結(jié)果返回到客戶端瀏覽器中,使用Response對(duì)象可以直接發(fā)送信息給瀏覽器、重定向?yàn)g覽器到另一個(gè) URL 或設(shè)置 cookie 的值等等。 Response對(duì)象在asp編程中非常廣泛,也是一種非常好用的工具。下面我們來具體看看Response對(duì)象:
語法:
Response.collection|property|method
一、集合
Response 對(duì)象只有一個(gè)集合 --Cookies,Cookies數(shù)據(jù)集合允許將數(shù)據(jù)設(shè)置在客戶端的瀏覽器中。若指定的 cookie 不存在,則創(chuàng)建它。若存在,則自動(dòng)更新數(shù)據(jù)。
語法:Response.Cookies(Cookie)[Key.Attribute]
這里的 cookie 是指定 cookie 的名稱。而如果指定了 key,則該 cookie 就是一個(gè)字典。attribute 指定 cookie 自身的有關(guān)信息。attribute 參數(shù)可以是下列之一 :
Domain 只寫。若被指定,則 cookie 將被發(fā)送到對(duì)該域的請(qǐng)求中去。
Expires 只寫。指定 cookie 的過期日期。為了在會(huì)話結(jié)束后將 cookie 存儲(chǔ)在客戶端磁盤上,必須設(shè)置該日期。若此項(xiàng)屬性的設(shè)置未超過當(dāng)前日期,則在任務(wù)結(jié)束后 cookie 將到期。
HasKeys 只讀。指定 cookie 是否包含關(guān)鍵字。
Path 只寫。若被指定,則 cookie 將只發(fā)送到對(duì)該路徑的請(qǐng)求中。如果未設(shè)置該屬性,則使用應(yīng)用程序的路徑。
Secure 只寫。指定Cookie是否安全。
示例:
<%
Response.Cookies("wrclub")("weburl")="http://www.wrclub.net"
Response.Cookies("wrclub").path="/wrclub/"
Response.Cookies("wrclub").Expires=#2003-11-30#
%>
二、方法
Response.AddHeader Name,Value
向應(yīng)答中添加一個(gè)新的HTML標(biāo)題。Name為新HTML標(biāo)題的名稱。Value為該頭變量的值。你可以添加任何名稱和任何值的HTML標(biāo)題。它并不替代現(xiàn)有的同名標(biāo)題。一旦標(biāo)題被添加,將不能刪除。
Response.AppendToLog String
向Web服務(wù)器的日志條目的末尾添加一字符串。String為要添加到日志文件中的字符串。
Response.BinaryWrite Data
該方法可以不經(jīng)任何字符轉(zhuǎn)換就將制定的信息寫到HTTP輸出,主要用于寫非字符串信息(如客戶端應(yīng)用程序所需的二進(jìn)制數(shù)據(jù)等)。Data是要發(fā)送的數(shù)據(jù)。
Response.Clear
刪除緩沖區(qū)的所有HTML輸出,但只刪除響應(yīng)正文而不刪除響應(yīng)標(biāo)題。可以用該方法處理錯(cuò)誤情況。需要注意的是,如果Response.Buffer設(shè)置為True,則該方法將導(dǎo)致運(yùn)行是錯(cuò)誤。
Response.End
強(qiáng)迫Web服務(wù)器停止執(zhí)行更多的腳本,并發(fā)送當(dāng)前結(jié)果,文件中剩余的內(nèi)容將不被處理。如果Response.Buffer設(shè)置為True,則調(diào)用Response.end將緩沖輸出。
Response.Flush
對(duì)于一個(gè)緩沖的回應(yīng),發(fā)送所有的緩沖信息。如果Response.Buffer設(shè)置為True,則該方法將導(dǎo)致運(yùn)行是錯(cuò)誤。
Response.Redirect URL
將客戶端的瀏覽器重定向到一個(gè)新的Internet地址。Url為新網(wǎng)頁的Internet地址。
Response.Write Variant
Response.Write是Response對(duì)象最常用的方法,該方法可以向?yàn)g覽器發(fā)送字符串。Variant是一字符串或一個(gè)具有字符串值的變量。
三、屬性
Response.Buffer
緩沖一Active Server Page。回應(yīng)只到某一頁結(jié)束或Response.Flush或Response.End方法調(diào)用時(shí)才發(fā)送出去。服務(wù)器將輸出送給客戶端后就不能再設(shè)置Buffer屬性。
Response.CacheControl
指明是否Proxy服務(wù)器能緩存Active Server Page。缺省時(shí),其值為FALSE 。當(dāng)設(shè)置其屬性為Public時(shí),Proxy服務(wù)器可以緩沖由Asp產(chǎn)生的輸出。
Response.CharSet(Charsetname)
將字符集名稱(如GB)附加到Response對(duì)象中content-type標(biāo)題的后面,用來設(shè)置web服務(wù)器響應(yīng)給客戶端的文件字符編碼。一個(gè)可能的值為“ISO_LATIN_1”。
Response.ContentType
指明回應(yīng)內(nèi)容的類型。可能的值為text/plain和image/GIF,默認(rèn)值text/HTML。
Response.Expires
瀏覽器可以緩存當(dāng)前頁的時(shí)間長度,以分鐘為單位。
Response.ExpiresAbsolute
瀏覽器不能再緩存當(dāng)前頁的日期和時(shí)間。在未到期之前,可以返回。如果未指定時(shí)間,該主頁在當(dāng)天午夜到期;如果未指定日期,則到當(dāng)天指定時(shí)間到期。
True/False = Response.IsClientConnected
屬性為只讀,指明自上次調(diào)用Response.Write之后,客戶端是否仍然和服務(wù)器連接。該屬性允許用戶在客戶端和服務(wù)器沒有聯(lián)接的情況下有更多的控制。例如,在從客戶端提出請(qǐng)求起到服務(wù)器做出相應(yīng),其間要用去很長一段時(shí)間的情況下,這就可能有助于確保在繼續(xù)處理腳本之前客戶端仍是連通的。具有值TRUE或FALSE。
Response.PICS (PICS 字符串)
用于添加網(wǎng)頁的PICS等級(jí)。PICS級(jí)別指明某一網(wǎng)頁的內(nèi)容級(jí)別,比如暴力或色情的程度等。
Response.Status = "狀態(tài)描述字符串"
用來設(shè)置Web服務(wù)器要響應(yīng)的狀態(tài)行的值。
用過軟件的朋友都知道,進(jìn)度條是一個(gè)優(yōu)秀軟件的重要組成部分。
它的存在能夠使用戶及時(shí)掌握程序的運(yùn)行進(jìn)度,確認(rèn)應(yīng)用程序正常工作。可是ASP中似乎沒有上述標(biāo)準(zhǔn)控件,控制起來也比較麻煩。
那幺如何實(shí)現(xiàn)進(jìn)度條呢?
以下是本人的一些觀點(diǎn)(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數(shù)據(jù)庫)的時(shí)候,會(huì)專門用一個(gè)頁面(*.asp)去處理或控制這些程序,當(dāng)處理完畢的時(shí)候再跳轉(zhuǎn)到顯示頁面。這時(shí)我們就可以通過這些處理頁面顯示進(jìn)度條。其方法是根據(jù)程序處理的進(jìn)度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進(jìn)度條。其效果與用其它編程工具所實(shí)現(xiàn)的基本相似
以下是一些Source,希望能夠給各位有個(gè)啟發(fā)。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進(jìn)度)
其中dmax為表示整個(gè)程序需要處理多少(dmax)步才能完成整個(gè)處理程序.
其中dstep表示當(dāng)前處理的步驟占整個(gè)處理過程中的分量,用數(shù)量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調(diào)用delayshow(1,10000)勢(shì)必不可能畫一次img,事實(shí)上
delayshow(100,10000)才畫一次,表示完成1%,因?yàn)?00占10000的1%.
sub delayshow(dstep,dmax)
dim total //顯示畫面100張img
dim dtemp //過渡變量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判斷當(dāng)要處理的東西連1%都沒有時(shí),不畫img同時(shí)用變量lostnum存放未畫的處理總數(shù),便于下次調(diào)用本過程時(shí)在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數(shù)
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經(jīng)畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時(shí)就需要
過程showlost()將余下未畫的img,通通顯示處理,實(shí)現(xiàn)進(jìn)度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請(qǐng)注意
這里需要用到緩存技術(shù)
response.buffer=true;
response.flush;
response.end
這些請(qǐng)參考MSDN幫助
用過軟件的朋友都知道,進(jìn)度條是一個(gè)優(yōu)秀軟件的重要組成部分。
它的存在能夠使用戶及時(shí)掌握程序的運(yùn)行進(jìn)度,確認(rèn)應(yīng)用程序正常工作。可是ASP中似乎沒有上述標(biāo)準(zhǔn)控件,控制起來也比較麻煩。
那幺如何實(shí)現(xiàn)進(jìn)度條呢?
以下是本人的一些觀點(diǎn)(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數(shù)據(jù)庫)的時(shí)候,會(huì)專門用一個(gè)頁面(*.asp)去處理或控制這些程序,當(dāng)處理完畢的時(shí)候再跳轉(zhuǎn)到顯示頁面。這時(shí)我們就可以通過這些處理頁面顯示進(jìn)度條。其方法是根據(jù)程序處理的進(jìn)度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進(jìn)度條。其效果與用其它編程工具所實(shí)現(xiàn)的基本相似
以下是一些Source,希望能夠給各位有個(gè)啟發(fā)。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進(jìn)度)
其中dmax為表示整個(gè)程序需要處理多少(dmax)步才能完成整個(gè)處理程序.
其中dstep表示當(dāng)前處理的步驟占整個(gè)處理過程中的分量,用數(shù)量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調(diào)用delayshow(1,10000)勢(shì)必不可能畫一次img,事實(shí)上
delayshow(100,10000)才畫一次,表示完成1%,因?yàn)?00占10000的1%.
sub delayshow(dstep,dmax)
dim total //顯示畫面100張img
dim dtemp //過渡變量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判斷當(dāng)要處理的東西連1%都沒有時(shí),不畫img同時(shí)用變量lostnum存放未畫的處理總數(shù),便于下次調(diào)用本過程時(shí)在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數(shù)
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經(jīng)畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時(shí)就需要
過程showlost()將余下未畫的img,通通顯示處理,實(shí)現(xiàn)進(jìn)度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請(qǐng)注意
這里需要用到緩存技術(shù)
response.buffer=true;
response.flush;
response.end
這些請(qǐng)參考MSDN幫助
用過軟件的朋友都知道,進(jìn)度條是一個(gè)優(yōu)秀軟件的重要組成部分。
它的存在能夠使用戶及時(shí)掌握程序的運(yùn)行進(jìn)度,確認(rèn)應(yīng)用程序正常工作。可是ASP中似乎沒有上述標(biāo)準(zhǔn)控件,控制起來也比較麻煩。
那幺如何實(shí)現(xiàn)進(jìn)度條呢?
以下是本人的一些觀點(diǎn)(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數(shù)據(jù)庫)的時(shí)候,會(huì)專門用一個(gè)頁面(*.asp)去處理或控制這些程序,當(dāng)處理完畢的時(shí)候再跳轉(zhuǎn)到顯示頁面。這時(shí)我們就可以通過這些處理頁面顯示進(jìn)度條。其方法是根據(jù)程序處理的進(jìn)度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進(jìn)度條。其效果與用其它編程工具所實(shí)現(xiàn)的基本相似
以下是一些Source,希望能夠給各位有個(gè)啟發(fā)。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進(jìn)度)
其中dmax為表示整個(gè)程序需要處理多少(dmax)步才能完成整個(gè)處理程序.
其中dstep表示當(dāng)前處理的步驟占整個(gè)處理過程中的分量,用數(shù)量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調(diào)用delayshow(1,10000)勢(shì)必不可能畫一次img,事實(shí)上
delayshow(100,10000)才畫一次,表示完成1%,因?yàn)?00占10000的1%.
sub delayshow(dstep,dmax)
dim total //顯示畫面100張img
dim dtemp //過渡變量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判斷當(dāng)要處理的東西連1%都沒有時(shí),不畫img同時(shí)用變量lostnum存放未畫的處理總數(shù),便于下次調(diào)用本過程時(shí)在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數(shù)
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經(jīng)畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時(shí)就需要
過程showlost()將余下未畫的img,通通顯示處理,實(shí)現(xiàn)進(jìn)度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請(qǐng)注意
這里需要用到緩存技術(shù)
response.buffer=true;
response.flush;
response.end
這些請(qǐng)參考MSDN幫助
用過軟件的朋友都知道,進(jìn)度條是一個(gè)優(yōu)秀軟件的重要組成部分。
它的存在能夠使用戶及時(shí)掌握程序的運(yùn)行進(jìn)度,確認(rèn)應(yīng)用程序正常工作。可是ASP中似乎沒有上述標(biāo)準(zhǔn)控件,控制起來也比較麻煩。
那幺如何實(shí)現(xiàn)進(jìn)度條呢?
以下是本人的一些觀點(diǎn)(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數(shù)據(jù)庫)的時(shí)候,會(huì)專門用一個(gè)頁面(*.asp)去處理或控制這些程序,當(dāng)處理完畢的時(shí)候再跳轉(zhuǎn)到顯示頁面。這時(shí)我們就可以通過這些處理頁面顯示進(jìn)度條。其方法是根據(jù)程序處理的進(jìn)度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進(jìn)度條。其效果與用其它編程工具所實(shí)現(xiàn)的基本相似
以下是一些Source,希望能夠給各位有個(gè)啟發(fā)。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進(jìn)度)
其中dmax為表示整個(gè)程序需要處理多少(dmax)步才能完成整個(gè)處理程序.
其中dstep表示當(dāng)前處理的步驟占整個(gè)處理過程中的分量,用數(shù)量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調(diào)用delayshow(1,10000)勢(shì)必不可能畫一次img,事實(shí)上
delayshow(100,10000)才畫一次,表示完成1%,因?yàn)?00占10000的1%.
sub delayshow(dstep,dmax)
dim total //顯示畫面100張img
dim dtemp //過渡變量
total=100
dtemp=dstep
dstep=dstep+lostnum
if (dstep*total)/dmax<1 then
//判斷當(dāng)要處理的東西連1%都沒有時(shí),不畫img同時(shí)用變量lostnum存放未畫的處理總數(shù),便于下次調(diào)用本過程時(shí)在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數(shù)
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經(jīng)畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時(shí)就需要
過程showlost()將余下未畫的img,通通顯示處理,實(shí)現(xiàn)進(jìn)度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請(qǐng)注意
這里需要用到緩存技術(shù)
response.buffer=true;
response.flush;
response.end
這些請(qǐng)參考MSDN幫助
' ===================================================================
' 讀取數(shù)據(jù)庫中數(shù)據(jù)到數(shù)組的類
' 作者:心飛翔
' QQ:85166 E-MAIL:Apwmj@hotmail.com
' 聲明:
' 如采用本類模塊,請(qǐng)不要去掉這個(gè)說明,這段注釋不會(huì)影響執(zhí)行的速度.
' 各種用途均可免費(fèi)使用,但是修改后必須把修改后的文件發(fā)送一份給作者.
' 2004年5月18日
' ===================================================================
DbPath = "test.mdb"'數(shù)據(jù)庫位置
ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(DbPath)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open ConnStr
Class Class_Read
Public Arr,Rs,SQL,ArrTR,ArrTD,Page,TotalRead,TotalPage
Public Function Read(SQL,TD,TR,PG)
SQL = Replace(SQL,"'","")
Page= Int(PG)
Set Rs = Server.CreateObject("ADODB.Recordset") : Rs.open SQL,conn,1,1
TotalRead= Rs.RecordCount
If TotalRead>0 Then
If TR>0 Then : Rs.PageSize = TR : Else : TR=TotalRead
If TD>Rs.Fields.Count or TD<1 Then TD = Rs.Fields.Count
If TotalRead Mod TR <>0 Then TotalPage = 1 : End If : TotalPage = TotalPage + Int(TotalRead/TR)
If Page>=TotalPage Then Page=TotalPage : TR = TotalRead-TR*(TotalPage-1)
If Page>1 Then Rs.absolutePage=Page Else Page=1
End If
reDim Arr(TD-1,TR)
For ArrTR = 0 to TR-1 : If Rs.Eof Then Exit For
For ArrTD = 0 to TD-1 : Arr(ArrTD,ArrTR) = Rs(ArrTD) : Next : Rs.MoveNext
Next
ArrTR = ArrTR-1
Rs.Close
Set Rs=Nothing
End Function
End Class
'使用方法
Dim C:Set C = New Class_Read
C.Read ("SQL語句","讀取列數(shù)","讀取行數(shù)[既每頁顯示條數(shù)]","當(dāng)前頁數(shù)")
Dim i
For i=0 To C.ArrTR
Response.Write "<br>內(nèi)容:"&C.Arr(0,i)
Next
Response.Write "<br>總記錄條數(shù):"&C.TotalRead
Response.Write "<br>總頁數(shù) :"&C.TotalPage
Response.Write "<br>當(dāng)前頁 :"&C.Page
Response.Write "<br>當(dāng)前記錄數(shù):"&C.ArrTR+1
<%
' Moving to random record - Steven Jones' Extension
If Not(記錄集名稱.bof and 記錄集名稱.eof) Then
' reset the cursor to the beginning
If (記錄集名稱.CursorType > 0) Then
記錄集名稱.MoveFirst
Else
記錄集名稱.Requery
End If
記錄集名稱_totalrn = -1
記錄集名稱_totalrn = 記錄集名稱.RecordCount ' ony works on some recordsets, but much faster
If (記錄集名稱_totalrn = -1) Then ' and if it didn't work, we still have to count the records.
' count the total records by iterating through the recordset
記錄集名稱_totalrn=0
While (Not 記錄集名稱.EOF)
記錄集名稱_totalrn = 記錄集名稱_totalrn + 1
記錄集名稱.MoveNext
Wend
' reset the cursor to the beginning
If (記錄集名稱.CursorType > 0) Then
記錄集名稱.MoveFirst
Else
記錄集名稱.Requery
End If
End If
' now do final adjustments, and move to the random record
記錄集名稱_totalrn = 記錄集名稱_totalrn - 1
If 記錄集名稱_totalrn > 0 Then
Randomize
記錄集名稱.Move Int((記錄集名稱_totalrn + 1) * Rnd)
End If
End If
' all done; you should always check for an empty recordset before displaying data
%>
||Function TimeDiff(sBegin, sEnd)
'||本函數(shù)計(jì)算兩個(gè)時(shí)間的差,可以不用更改直接使用
'||作者:machinecat 2001/10/26
'******************************
'******************************
'注:首先需要判斷用戶輸入的sBegin與sEnd之間的大小
'可以通過DataDiff函數(shù)獲得兩者之間的時(shí)間差,不需要進(jìn)行復(fù)雜的時(shí)間換算
'******************************
Function TimeDiff(sBegin, sEnd)
Dim iHourB, iMinuteB, iSecondB, iMiniSecondB
Dim iHourE, iMinuteE, iSecondE, iMiniSecondE
Dim dTimeB, dTimeE, dTimeDiff
Dim iHour, iMinute, iSecond, iMiniSecond
iHourB = clng(Left(sBegin, 2))
iMinuteB = clng(Mid(sBegin, 4, 2))
iSecondB = clng(Mid(sBegin, 7, 2))
iMiniSecondB = clng(Mid(sBegin, 10, 4))
iHourE = clng(Left(sEnd, 2))
iMinuteE = clng(Mid(sEnd, 4, 2))
iSecondE = clng(Mid(sEnd, 7, 2))
iMiniSecondE = clng(Mid(sEnd, 10, 4))
dTimeB = iHourB * 3600 + iMinuteB * 60 + iSecondB + iMiniSecondB / 1000
dTimeE = iHourE * 3600 + iMinuteE * 60 + iSecondE + iMiniSecondE / 1000
dTimeDiff = dTimeE - dTimeB
iHour = Int(dTimeDiff / 3600)
dTimeDiff = dTimeDiff - iHour * 3600
iMinute = Int(dTimeDiff / 60)
dTimeDiff = dTimeDiff - iMinute * 60
iSecond = Int(dTimeDiff)
dTimeDiff = dTimeDiff - Int(dTimeDiff)
iMiniSecond = dTimeDiff
TimeDiff = iHour & "小時(shí)" & iMinute & "分鐘" & iSecond & FormatNumber(iMiniSecond, 3) & "秒"
End Function
<%
function URLconvert(str)
convertstr=str
urlLocation=instr(convertstr,"http://")
if (urlLocation=0) and (mailLocation=0) then
URLconvert=convertstr
exit function
end if
if urlLocation<>0 then
rightstr=str
Do while urlLocation<>urlLocationend
urlLocation=instr(rightstr,"http://")
urlLocationend=InStrRev(rightstr,"http://")
finalstr=finalstr&left(rightstr,urlLocation-1)
midurlstr=mid(rightstr,urlLocation+1,1)
do while (asc(midurlstr)>=45) and (asc(midurlstr)<=126)
loopint=loopint+1
midurlstr=mid(rightstr,urlLocation+loopint,1)
if midurlstr="" then exit do
loop
endURLstr=mid(rightstr,urllocation,loopint)
URLstr="<a href="&endURLstr&">"&endURLstr&"</a>"
rightstr=mid(rightstr,urllocation+loopint)
finalstr=finalstr&URLstr
loopint=1
Loop
end if
finalstr=finalstr&rightstr
convertstr1=finalstr
finalstr=""
mailLocation=instr(convertstr1,"@")
if mailLocation<>0 then
Do while mailLocation<>mailLocationend
mailLocation=instr(convertstr1,"@")
mailLocationend=InStrRev(convertstr1,"@")
mainmidmailstr=mid(convertstr1,mailLocation+1,1)
midmailstr=mainmidmailstr
do while (asc(midmailstr)>=45) and (asc(midmailstr)<=126)
loopint1=loopint1+1
midmailstr=mid(convertstr1,mailLocation-loopint1,1)
loop
firstSTR=mid(convertstr1,mailLocation-loopint1+1,loopint1-1)
finalstr=finalstr&left(convertstr1,mailLocation-loopint1)
midmailstr1=mainmidmailstr
do while (asc(midmailstr1)>=45) and (asc(midmailstr1)<=126)
loopint2=loopint2+1
midmailstr1=mid(convertstr1,mailLocation+loopint2,1)
if midmailstr1="" then exit do
loop
secondSTR=mid(convertstr1,mailLocation,loopint2)
endmailstr=firstSTR&secondSTR
mailstr="<a href=mailto:"&endmailstr&">"&endmailstr&"</a>"
finalstr=finalstr&mailstr
convertstr1=mid(convertstr1,maillocation+loopint2)
loopint1=1
loopint2=1
Loop
end if
finalstr=finalstr&convertstr1
URLconvert=finalstr
end function
%>
隨著計(jì)算機(jī)硬件的發(fā)展,許多朋友購買了新的計(jì)算機(jī),但是以前機(jī)器上的硬盤都舍不得丟棄,所以就拿它們作為一個(gè)備份硬盤使用。但是這也給大家?guī)砹艘粋€(gè)問題——安裝了雙硬盤之后,原先硬盤上的盤符與新硬盤上的盤符會(huì)出現(xiàn)交叉的情況,也就是說C盤是安裝了操作系統(tǒng)物理盤的一個(gè)分區(qū),但是D盤就變成另外一個(gè)物理盤的盤符了,這樣在使用的時(shí)候就有些麻煩。而且當(dāng)你將第二個(gè)硬盤拆卸下來刻盤或者是作為它用的時(shí)候,整個(gè)系統(tǒng)中的文件路徑就會(huì)出錯(cuò):安裝在D盤上的文件不見了,而安裝在E盤上的程序轉(zhuǎn)移到D盤上,除非你再將第二硬盤掛上,否則就只能手工對(duì)其進(jìn)行修正。筆者的計(jì)算機(jī)也剛升級(jí),而且也使用了雙硬盤,所以帶著這個(gè)問題仔細(xì)對(duì)系統(tǒng)進(jìn)行了一番研究,最后終于找出了解決之道,要是你也被這種難堪所困擾的話,不妨來看看如何解決雙硬盤交叉盤符的問題。
一、系統(tǒng)升級(jí)
第一個(gè)方法也是最簡(jiǎn)單的就是將你所使用的操作系統(tǒng)升級(jí)到Windows 2000。因?yàn)閃indows 2000采用的內(nèi)核與Windows 9X不同,而且對(duì)于多個(gè)硬盤的辨識(shí)能力與處理能力比Windows 9X要高出一籌,所以采用Windows 2000之后,安裝雙硬盤的時(shí)候系統(tǒng)會(huì)自動(dòng)把新硬盤的盤符添加到原先硬盤盤符后面。
但是Windows 2000對(duì)于硬件的要求實(shí)在是太高了,大家千萬不要相信微軟信誓旦旦的“Pentium 133、32M內(nèi)存”的標(biāo)準(zhǔn)配置,難道你想在安裝的時(shí)候喝完一杯茶而安裝進(jìn)度還沒有增加百分之一?或者是在使用的時(shí)候移動(dòng)一下鼠標(biāo)帶來的就是“嘩嘩”的硬盤響聲?所以對(duì)于那些機(jī)器不夠棒的朋友,還是建議你采用后面說到的兩種方法。
二、CMOS修改
如果你使用的是Windows 98操作系統(tǒng),那么可以在CMOS中將第二硬盤的選項(xiàng)設(shè)置為“NONE”。比如掛接在第一根硬盤線的Slave端,就在CMOS中設(shè)置“IDE Primary Slave”為“NONE”,這樣在開機(jī)的時(shí)候系統(tǒng)會(huì)省去對(duì)第二硬盤的查找,進(jìn)入Windows 98之后,你會(huì)發(fā)現(xiàn)第二塊硬盤已經(jīng)被找到,而且交叉盤符的現(xiàn)象也不復(fù)存在。
不過遺憾的是,這種方法只有在Windows 98操作系統(tǒng)下才能實(shí)現(xiàn)的,如果你使用Windows 95就不能享受這種便利的設(shè)置優(yōu)勢(shì)了。而且即使你采用的是Windows 98系統(tǒng),只要切換到DOS狀態(tài)的時(shí)候,第二硬盤就會(huì)自動(dòng)消失,要是你需要經(jīng)常在DOS下處理文件,那么這種方法還不是最佳的解決之道。
三、分區(qū)大法
事到如今,還有最后一招,保管你一勞永逸,絕無后顧之憂,這就是對(duì)第二塊重新分區(qū)。采用這種方法,無論在什么操作系統(tǒng)下,CMOS中如何設(shè)置,都可以解決盤符交叉的問題。想必這就是大家所最為關(guān)注的,所以在此對(duì)其的操作步驟介紹一下。
1、將兩塊硬盤安裝好之后,開機(jī)的時(shí)候按下“F8”鍵并選擇相應(yīng)的選項(xiàng)進(jìn)入DOS狀態(tài)。
2、鍵入“Fdisk”,然后會(huì)看見分區(qū)主界面,其中比以往大家所看見的多出了第五個(gè)選項(xiàng)“Change current fixed disk drive”,選擇此項(xiàng)之后按回車鍵繼續(xù)。
3、接下來看見的是硬盤以及分區(qū)列表,這時(shí)大家選中第二個(gè)硬盤,然后按照先刪除擴(kuò)展分區(qū),再刪除主分區(qū)的步驟將這塊硬盤上的分區(qū)刪除。
4、在對(duì)第二硬盤重新建立分區(qū)的時(shí)候要注意,一定不能選擇“Create Primary DOS Partition”在這塊硬盤上創(chuàng)建主分區(qū),而要選擇“Create Extended DOS Partition”把所有的空間都分配給擴(kuò)展分區(qū)使用。接著再按照自己的需要把這個(gè)硬盤分為多個(gè)分區(qū)。
5、分區(qū)完畢之后,重新啟動(dòng)計(jì)算機(jī),等進(jìn)入Windows之后調(diào)用資源管理器會(huì)發(fā)現(xiàn)原先交叉的盤符現(xiàn)在已經(jīng)老老實(shí)實(shí)的按照規(guī)矩排列了,這時(shí)再對(duì)它們進(jìn)行格式化處理,這塊第二硬盤就可以像原先的那塊一樣正常使用了。
但是這種方法也有一個(gè)缺點(diǎn),就是會(huì)完全破壞第二硬盤上的數(shù)據(jù),不過說起來也好解決,現(xiàn)在的硬盤都是又平又靚(又便宜又好)了,像主流的20G硬盤,只要八百多元,完全可以把你早期只有1G多的內(nèi)容全部復(fù)制過來了吧。
好了,到此為止,解決雙硬盤盤符交叉的三種方法全部告訴大家了,至于你選用哪一種就看你自己的實(shí)際情況了。
首先了解什么是IIS連接數(shù)。
IIS連接數(shù)指并發(fā)連接數(shù),什么意思呢?
要分幾種情況:(以100M空間50人在線為例)
A 用戶單點(diǎn)下載你的文件,結(jié)束后正常斷開,這些連接是按照瞬間計(jì)算的,就是說你50人的網(wǎng)站瞬間可以接受同時(shí)50個(gè)點(diǎn)下載
B 用戶打開你的頁面,就算停留在頁面沒有對(duì)服務(wù)器發(fā)出任何請(qǐng)求,那么在用戶打開一面以后的15分鐘內(nèi)也都要算一個(gè)在線,就是說你50人的網(wǎng)站15分鐘內(nèi)可以接受不同用戶打開50個(gè)頁面
C 上面B的情況用戶繼續(xù)打開同一個(gè)網(wǎng)站的其他頁面,那么在線人數(shù)按照用戶最后一次點(diǎn)擊(發(fā)出請(qǐng)求)以后的15分鐘計(jì)算,在這個(gè)15分鐘內(nèi)不管用戶怎么點(diǎn)擊(包括新窗口打開)都還是一人在線。
D 當(dāng)你的頁面內(nèi)存在框架(Iframe),那么每多一個(gè)框架就要多一倍的在線!因?yàn)檫@相當(dāng)于用戶同一時(shí)間向服務(wù)器請(qǐng)求了多個(gè)頁面。
E 當(dāng)用戶打開頁面然后正常關(guān)閉瀏覽器,用戶的在線人數(shù)也會(huì)馬上清除。
然后了解什么是論壇在線人數(shù)。
論壇在線只是計(jì)算一定時(shí)間內(nèi)的活動(dòng)用戶數(shù)。
這里的時(shí)間用戶可以自己設(shè)定(刪除不活動(dòng)用戶時(shí)間),動(dòng)網(wǎng)論壇默認(rèn)為40分鐘的相對(duì)準(zhǔn)確值。
根據(jù)上面的說明,顯然論壇在線和IIS連接數(shù)的概念不同
為什么會(huì)出現(xiàn)IIS連接數(shù)和論壇在線不符合的情況?
現(xiàn)具體分析如下:
1:您使用了插件版論壇!
現(xiàn)在的插件很**,不但占服務(wù)器資源,而且會(huì)使論壇運(yùn)行變慢( 沒有插件可以快一倍以上 ),同時(shí)很占在線人數(shù),有的插件調(diào)用很多框架,少則2、3個(gè),多則4、5個(gè)! 甚至有在線播放音樂,這樣一個(gè)人在線就相當(dāng)與很多人在線!
2:您的網(wǎng)站是主頁+論壇的形式!
這樣主頁和論壇要爭(zhēng)奪你的在線人數(shù)!
3:你的論壇內(nèi)部有播放器!
一個(gè)人在線,然后他在線播放音樂,就占二個(gè)人在線!
4:你的論壇內(nèi)部存在框架形式的網(wǎng)頁!
每一個(gè)框架,就多一倍的在線!
5:你的論壇設(shè)置在線時(shí)間過小!
動(dòng)網(wǎng)默認(rèn)為40分鐘, 這個(gè)默認(rèn)值下,一般我們20IIS的學(xué)習(xí)型主機(jī)可以達(dá)到50人左右 ,因?yàn)檎搲诰€只是計(jì)算一定時(shí)間內(nèi)的活動(dòng)用戶數(shù),當(dāng)您設(shè)定的時(shí)間較小的時(shí)候,看起來論壇在線的人數(shù)就自然少了,請(qǐng)把 刪除不活動(dòng)用戶時(shí)間 改為默認(rèn)的40分鐘就可以!
6:你的空間存在多個(gè)論壇!
有的客戶在一個(gè)空間里上傳多個(gè)論壇,如bbs bbs1 bbs2 等等 等等
毫無疑問,這樣個(gè)論壇也是要爭(zhēng)奪再線人數(shù)的!
7:你的論壇圖片等文件被人盜鏈!
比如:你的論壇有張圖片文件,被粘貼(注意是粘貼不是上傳)到別的論壇!
別的論壇的用戶在瀏覽該文件的時(shí)候也算一個(gè)在線人數(shù)!
尤其是LOGO連接的時(shí)候注意,一定要對(duì)方把您的LOGO上傳到他的空間!
8:你的空間上放有下載文件!
如果用戶用網(wǎng)絡(luò)螞蟻類的軟件,每一個(gè)線程就表示一個(gè)在線,非常厲害
9:最新發(fā)現(xiàn)如果網(wǎng)站首頁直接調(diào)用論壇的新帖子可能導(dǎo)致IIS超出標(biāo)準(zhǔn)建議網(wǎng)站使用靜態(tài)頁面
<%
'------------------------------------------------------------------------
'-------------------無垠網(wǎng)域:http://www.5inet.net/ ---------------------
'-------------------作者:嘻哈呵嘿 ,webmaster@5inet.net -----------------
'----------遠(yuǎn)程獲取內(nèi)容,并將內(nèi)容存在本地電腦上,包括任何文件!----------
'---------------利用xmlhttp和adodb.stream,酷!絕對(duì)原創(chuàng)!-----------------
'On Error Resume Next
'Set the content type to the specific type that you are sending.
'Response.ContentType = "IMAGE/JPEG"
'-------------------------------定義輸出格式-----------------------------
Path=request.querystring("p")
sPath = Path
if left(lcase(path),7) <> "http://" then
'-------------如果前面沒有http就是本地文件,交給LocalFile處理------------
LocalFile(path)
else
'--------------------否則為遠(yuǎn)程文件,交給RemoteFile處理------------------
RemoteFile(Path)
end if
'Response.Write err.Description
sub LocalFile(Path)
'-------------------如果為本地文件則簡(jiǎn)單的跳轉(zhuǎn)到該頁面-------------------
Response.Redirect Path
End Sub
Sub RemoteFile(sPath)
'-------------------------處理遠(yuǎn)程文件函數(shù)------------------------------
FileName = GetFileName(sPath)
'-------------GetFileName為把地址轉(zhuǎn)換為合格的文件名過程-------------
FileName = Server.MapPath("/UploadFile/Cache/" & FileName)
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write fileName
if objFso.FileExists(FileName) Then
'--------------檢查文件是否是已經(jīng)訪問過,如是,則簡(jiǎn)單跳轉(zhuǎn)------------
Response.Redirect "/uploadfile/cache/" & GetFileName(path)
Else
'----------------否則的話就先用GetBody函數(shù)讀取----------------------
'Response.Write Path
t = GetBody(Path)
'-----------------用二進(jìn)制方法寫到瀏覽器上--------------------------
Response.BinaryWrite t
Response.Flush
'-----------------輸出緩沖------------------------------------------
SaveFile t,GetFileName(path)
'------------------將文件內(nèi)容緩存到本地路徑,以待下次訪問-----------
End if
Set objFso = Nothing
End Sub
Function GetBody(url)
'-----------------------本函數(shù)為遠(yuǎn)程獲取內(nèi)容的函數(shù)---------------------
'on error resume next
'Response.Write url
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
'----------------------建立XMLHTTP對(duì)象-----------------------------
With Retrieval
.Open "Get", url, False, "", ""
'------------------用Get,異步的方法發(fā)送-----------------------
.Send
'GetBody = .ResponseText
GetBody = .ResponseBody
'------------------函數(shù)返回獲取的內(nèi)容--------------------------
End With
Set Retrieval = Nothing
'response.Write err.Description
End Function
Function GetFileName(str)
'-------------------------本函數(shù)為合格化的文件名函數(shù)-------------------
str = Replace(lcase(str),"http://","")
str = Replace(lcase(str),"http://","/")
str = Replace(str,"/","")
str = replace(str,vbcrlf,"")
GetFileName = str
End Function
sub SaveFile(str,fName)
'-------------------------本函數(shù)為將流內(nèi)容存盤的函數(shù)-------------------
'on error resume next
Set objStream = Server.CreateObject("ADODB.Stream")
'--------------建立ADODB.Stream對(duì)象,必須要ADO 2.5以上版本---------
objStream.Type = adTypeBinary
'-------------以二進(jìn)制模式打開-------------------------------------
objStream.Open
objstream.write str
'--------------------將字符串內(nèi)容寫入緩沖--------------------------
'response.Write fname
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite
'--------------------將緩沖的內(nèi)容寫入文件--------------------------
'response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
'-----------------------關(guān)閉對(duì)象,釋放資源-------------------------
'response.Write err.Description
End sub
%>