要讀懂這些代碼主要是要了解ASP中操作二進制數據的對象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有這個基礎,就可以進一步添加更多的功能如加入雜點,漸變底色,數字行列錯位,筆畫短點,提高被ocr識別的不可能。目前還沒有好的識別引擎,昨天下載了個號稱能識別圖像驗證碼90%的!把4321識別成 89910,所以圖像碼還是比較安全的。
在網上看到有暴力破解的方法,如果我用圖像附加碼+禁止外部提交+10次密碼錯誤封帳號 +50次密碼錯誤瑣死IP+10秒的防刷新間隔注冊頁,登陸頁均要加上+禁止外部提交,這樣,暴力破解應該就沒戲了。
Asp文件:Code.Asp
數據文件: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
生成隨機四位數字:
zNum = cint(8999*Rnd+1000)
傳遞給session
Session("GetCode") = zNum
該for循環是將隨機數字放入一個下標3的數組,便于提供給后面的陣列變換
dim zimg(3),NStr
NStr=cstr(zNum)
For i=0 to 3
zimg(i)=cint(mid(NStr,i+1,1))
Next
dim Pos
'定義二個 ADODB.Stream binary對象,作圖像數據操作之用:
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的數字數據10x100的,Gbr的陣列數據,每個320字節,10個數字3200byte
'BGR一個點,10x10個點一個數字,一個點三個字節(二進制8位,16進制 00~FF)
'一行10個點 30字節 + 行結束標記 00 00 二字節 32字節,所以一個10x100寬小于長的圖像每個數字10x10是320字節
'長大于寬的則無行結束標記 0000,直接是300字節
這些就是BMP 24bit的數據詳細信息了
‘至于頭部,也很簡單,包含長寬,圖像開始標記等等~~才54字節,遠沒jpg什么的復雜
Ados.LoadFromFile(Server.mappath("body.Fix"))
Ados1.write Ados.read(1280)
'第一個for循環,按生成的隨機數字順序從 10X100的數字陣列中提取出相應的四個數字
但是豎排的數字陣列
for i=0 to 3
Ados.Position=(9-zimg(i))*320
Ados1.Position=i*320
Ados1.write ados.read(320)
next
'清空已經用完的ADOS的數據,調入替換新的圖像頭54字節的頭文件
Ados.LoadFromFile(Server.mappath("head.fix"))
Pos=lenb(Ados.read())
Ados.Position=Pos '指定Pos位置,即可再偏移54字節的位置添加圖形數據
第二個for循環,進行數字的陣列變換,由豎排的塊轉換為橫排的數字塊
方法是隔320字節抽取4次30字節寫入ados對象,再抽取偏移第二行的圖像數據
30字節是因為bmp 寬大于長時無00 00的行結束標記
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直接向客戶端發送圖像數據
Response.ContentType = "image/BMP"
Response.BinaryWrite Ados.read()
Ados.Close:set Ados=nothing
Ados1.Close:set Ados1=nothing
End Function
每一個程序語言或開發工具都有一定的函數與用戶進行溝通,Asp同樣如此。在Asp中負責將信息傳遞給用戶的對象就是Response對象。Response對象用于動態響應客戶端請求(Request),并將動態生成的響應結果返回到客戶端瀏覽器中,使用Response對象可以直接發送信息給瀏覽器、重定向瀏覽器到另一個 URL 或設置 cookie 的值等等。 Response對象在asp編程中非常廣泛,也是一種非常好用的工具。下面我們來具體看看Response對象:
語法:
Response.collection|property|method
一、集合
Response 對象只有一個集合 --Cookies,Cookies數據集合允許將數據設置在客戶端的瀏覽器中。若指定的 cookie 不存在,則創建它。若存在,則自動更新數據。
語法:Response.Cookies(Cookie)[Key.Attribute]
這里的 cookie 是指定 cookie 的名稱。而如果指定了 key,則該 cookie 就是一個字典。attribute 指定 cookie 自身的有關信息。attribute 參數可以是下列之一 :
Domain 只寫。若被指定,則 cookie 將被發送到對該域的請求中去。
Expires 只寫。指定 cookie 的過期日期。為了在會話結束后將 cookie 存儲在客戶端磁盤上,必須設置該日期。若此項屬性的設置未超過當前日期,則在任務結束后 cookie 將到期。
HasKeys 只讀。指定 cookie 是否包含關鍵字。
Path 只寫。若被指定,則 cookie 將只發送到對該路徑的請求中。如果未設置該屬性,則使用應用程序的路徑。
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
向應答中添加一個新的HTML標題。Name為新HTML標題的名稱。Value為該頭變量的值。你可以添加任何名稱和任何值的HTML標題。它并不替代現有的同名標題。一旦標題被添加,將不能刪除。
Response.AppendToLog String
向Web服務器的日志條目的末尾添加一字符串。String為要添加到日志文件中的字符串。
Response.BinaryWrite Data
該方法可以不經任何字符轉換就將制定的信息寫到HTTP輸出,主要用于寫非字符串信息(如客戶端應用程序所需的二進制數據等)。Data是要發送的數據。
Response.Clear
刪除緩沖區的所有HTML輸出,但只刪除響應正文而不刪除響應標題。可以用該方法處理錯誤情況。需要注意的是,如果Response.Buffer設置為True,則該方法將導致運行是錯誤。
Response.End
強迫Web服務器停止執行更多的腳本,并發送當前結果,文件中剩余的內容將不被處理。如果Response.Buffer設置為True,則調用Response.end將緩沖輸出。
Response.Flush
對于一個緩沖的回應,發送所有的緩沖信息。如果Response.Buffer設置為True,則該方法將導致運行是錯誤。
Response.Redirect URL
將客戶端的瀏覽器重定向到一個新的Internet地址。Url為新網頁的Internet地址。
Response.Write Variant
Response.Write是Response對象最常用的方法,該方法可以向瀏覽器發送字符串。Variant是一字符串或一個具有字符串值的變量。
三、屬性
Response.Buffer
緩沖一Active Server Page。回應只到某一頁結束或Response.Flush或Response.End方法調用時才發送出去。服務器將輸出送給客戶端后就不能再設置Buffer屬性。
Response.CacheControl
指明是否Proxy服務器能緩存Active Server Page。缺省時,其值為FALSE 。當設置其屬性為Public時,Proxy服務器可以緩沖由Asp產生的輸出。
Response.CharSet(Charsetname)
將字符集名稱(如GB)附加到Response對象中content-type標題的后面,用來設置web服務器響應給客戶端的文件字符編碼。一個可能的值為“ISO_LATIN_1”。
Response.ContentType
指明回應內容的類型。可能的值為text/plain和image/GIF,默認值text/HTML。
Response.Expires
瀏覽器可以緩存當前頁的時間長度,以分鐘為單位。
Response.ExpiresAbsolute
瀏覽器不能再緩存當前頁的日期和時間。在未到期之前,可以返回。如果未指定時間,該主頁在當天午夜到期;如果未指定日期,則到當天指定時間到期。
True/False = Response.IsClientConnected
屬性為只讀,指明自上次調用Response.Write之后,客戶端是否仍然和服務器連接。該屬性允許用戶在客戶端和服務器沒有聯接的情況下有更多的控制。例如,在從客戶端提出請求起到服務器做出相應,其間要用去很長一段時間的情況下,這就可能有助于確保在繼續處理腳本之前客戶端仍是連通的。具有值TRUE或FALSE。
Response.PICS (PICS 字符串)
用于添加網頁的PICS等級。PICS級別指明某一網頁的內容級別,比如暴力或色情的程度等。
Response.Status = "狀態描述字符串"
用來設置Web服務器要響應的狀態行的值。
用過軟件的朋友都知道,進度條是一個優秀軟件的重要組成部分。
它的存在能夠使用戶及時掌握程序的運行進度,確認應用程序正常工作。可是ASP中似乎沒有上述標準控件,控制起來也比較麻煩。
那幺如何實現進度條呢?
以下是本人的一些觀點(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數據庫)的時候,會專門用一個頁面(*.asp)去處理或控制這些程序,當處理完畢的時候再跳轉到顯示頁面。這時我們就可以通過這些處理頁面顯示進度條。其方法是根據程序處理的進度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進度條。其效果與用其它編程工具所實現的基本相似
以下是一些Source,希望能夠給各位有個啟發。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進度)
其中dmax為表示整個程序需要處理多少(dmax)步才能完成整個處理程序.
其中dstep表示當前處理的步驟占整個處理過程中的分量,用數量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調用delayshow(1,10000)勢必不可能畫一次img,事實上
delayshow(100,10000)才畫一次,表示完成1%,因為100占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
//判斷當要處理的東西連1%都沒有時,不畫img同時用變量lostnum存放未畫的處理總數,便于下次調用本過程時在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時就需要
過程showlost()將余下未畫的img,通通顯示處理,實現進度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請注意
這里需要用到緩存技術
response.buffer=true;
response.flush;
response.end
這些請參考MSDN幫助
用過軟件的朋友都知道,進度條是一個優秀軟件的重要組成部分。
它的存在能夠使用戶及時掌握程序的運行進度,確認應用程序正常工作。可是ASP中似乎沒有上述標準控件,控制起來也比較麻煩。
那幺如何實現進度條呢?
以下是本人的一些觀點(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數據庫)的時候,會專門用一個頁面(*.asp)去處理或控制這些程序,當處理完畢的時候再跳轉到顯示頁面。這時我們就可以通過這些處理頁面顯示進度條。其方法是根據程序處理的進度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進度條。其效果與用其它編程工具所實現的基本相似
以下是一些Source,希望能夠給各位有個啟發。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進度)
其中dmax為表示整個程序需要處理多少(dmax)步才能完成整個處理程序.
其中dstep表示當前處理的步驟占整個處理過程中的分量,用數量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調用delayshow(1,10000)勢必不可能畫一次img,事實上
delayshow(100,10000)才畫一次,表示完成1%,因為100占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
//判斷當要處理的東西連1%都沒有時,不畫img同時用變量lostnum存放未畫的處理總數,便于下次調用本過程時在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時就需要
過程showlost()將余下未畫的img,通通顯示處理,實現進度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請注意
這里需要用到緩存技術
response.buffer=true;
response.flush;
response.end
這些請參考MSDN幫助
用過軟件的朋友都知道,進度條是一個優秀軟件的重要組成部分。
它的存在能夠使用戶及時掌握程序的運行進度,確認應用程序正常工作。可是ASP中似乎沒有上述標準控件,控制起來也比較麻煩。
那幺如何實現進度條呢?
以下是本人的一些觀點(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數據庫)的時候,會專門用一個頁面(*.asp)去處理或控制這些程序,當處理完畢的時候再跳轉到顯示頁面。這時我們就可以通過這些處理頁面顯示進度條。其方法是根據程序處理的進度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進度條。其效果與用其它編程工具所實現的基本相似
以下是一些Source,希望能夠給各位有個啟發。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進度)
其中dmax為表示整個程序需要處理多少(dmax)步才能完成整個處理程序.
其中dstep表示當前處理的步驟占整個處理過程中的分量,用數量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調用delayshow(1,10000)勢必不可能畫一次img,事實上
delayshow(100,10000)才畫一次,表示完成1%,因為100占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
//判斷當要處理的東西連1%都沒有時,不畫img同時用變量lostnum存放未畫的處理總數,便于下次調用本過程時在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時就需要
過程showlost()將余下未畫的img,通通顯示處理,實現進度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請注意
這里需要用到緩存技術
response.buffer=true;
response.flush;
response.end
這些請參考MSDN幫助
用過軟件的朋友都知道,進度條是一個優秀軟件的重要組成部分。
它的存在能夠使用戶及時掌握程序的運行進度,確認應用程序正常工作。可是ASP中似乎沒有上述標準控件,控制起來也比較麻煩。
那幺如何實現進度條呢?
以下是本人的一些觀點(僅供參考)
我們通常在用ASP處理程序(指的是寫文件或操作數據庫)的時候,會專門用一個頁面(*.asp)去處理或控制這些程序,當處理完畢的時候再跳轉到顯示頁面。這時我們就可以通過這些處理頁面顯示進度條。其方法是根據程序處理的進度依次畫一百張同樣的圖形(如有顏色的矩形),從而形成進度條。其效果與用其它編程工具所實現的基本相似
以下是一些Source,希望能夠給各位有個啟發。
response.buffer=true
dim lostnum
dim shownum
delayshow(dstep,dmax)過程是用于顯示多少img(畫多少進度)
其中dmax為表示整個程序需要處理多少(dmax)步才能完成整個處理程序.
其中dstep表示當前處理的步驟占整個處理過程中的分量,用數量表示。
變量lostnum的存在是由于dmax過大(比如10000),而dstep過小(比如1)造成的。如果調用delayshow(1,10000)勢必不可能畫一次img,事實上
delayshow(100,10000)才畫一次,表示完成1%,因為100占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
//判斷當要處理的東西連1%都沒有時,不畫img同時用變量lostnum存放未畫的處理總數,便于下次調用本過程時在處理。
lostnum=lostnum+dtemp
else
for ccc=1 to fix((dstep*total)/dmax) //取整數
Response.Write "<img src=""../images/delay1.jpg"">"
next
Response.Flush //將緩存里的東西(圖片)顯示出來
//變量shownum用于存放目前已經畫的img
shownum=shownum+fix((dstep*total)/dmax)
lostnum=0
end if
end sub
//由于算法的問題,主要是取余造成不能完全畫100次,這時就需要
過程showlost()將余下未畫的img,通通顯示處理,實現進度條的等長
sub showlost()
for ccc=1 to (100-shownum)
Response.Write ("<img src=""../images/delay1.jpg"">")
next
Response.Write "<BR>"
Response.Flush
end sub
最后請注意
這里需要用到緩存技術
response.buffer=true;
response.flush;
response.end
這些請參考MSDN幫助
' ===================================================================
' 讀取數據庫中數據到數組的類
' 作者:心飛翔
' QQ:85166 E-MAIL:Apwmj@hotmail.com
' 聲明:
' 如采用本類模塊,請不要去掉這個說明,這段注釋不會影響執行的速度.
' 各種用途均可免費使用,但是修改后必須把修改后的文件發送一份給作者.
' 2004年5月18日
' ===================================================================
DbPath = "test.mdb"'數據庫位置
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語句","讀取列數","讀取行數[既每頁顯示條數]","當前頁數")
Dim i
For i=0 To C.ArrTR
Response.Write "<br>內容:"&C.Arr(0,i)
Next
Response.Write "<br>總記錄條數:"&C.TotalRead
Response.Write "<br>總頁數 :"&C.TotalPage
Response.Write "<br>當前頁 :"&C.Page
Response.Write "<br>當前記錄數:"&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)
'||本函數計算兩個時間的差,可以不用更改直接使用
'||作者:machinecat 2001/10/26
'******************************
'******************************
'注:首先需要判斷用戶輸入的sBegin與sEnd之間的大小
'可以通過DataDiff函數獲得兩者之間的時間差,不需要進行復雜的時間換算
'******************************
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 & "小時" & 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
%>
隨著計算機硬件的發展,許多朋友購買了新的計算機,但是以前機器上的硬盤都舍不得丟棄,所以就拿它們作為一個備份硬盤使用。但是這也給大家帶來了一個問題——安裝了雙硬盤之后,原先硬盤上的盤符與新硬盤上的盤符會出現交叉的情況,也就是說C盤是安裝了操作系統物理盤的一個分區,但是D盤就變成另外一個物理盤的盤符了,這樣在使用的時候就有些麻煩。而且當你將第二個硬盤拆卸下來刻盤或者是作為它用的時候,整個系統中的文件路徑就會出錯:安裝在D盤上的文件不見了,而安裝在E盤上的程序轉移到D盤上,除非你再將第二硬盤掛上,否則就只能手工對其進行修正。筆者的計算機也剛升級,而且也使用了雙硬盤,所以帶著這個問題仔細對系統進行了一番研究,最后終于找出了解決之道,要是你也被這種難堪所困擾的話,不妨來看看如何解決雙硬盤交叉盤符的問題。
一、系統升級
第一個方法也是最簡單的就是將你所使用的操作系統升級到Windows 2000。因為Windows 2000采用的內核與Windows 9X不同,而且對于多個硬盤的辨識能力與處理能力比Windows 9X要高出一籌,所以采用Windows 2000之后,安裝雙硬盤的時候系統會自動把新硬盤的盤符添加到原先硬盤盤符后面。
但是Windows 2000對于硬件的要求實在是太高了,大家千萬不要相信微軟信誓旦旦的“Pentium 133、32M內存”的標準配置,難道你想在安裝的時候喝完一杯茶而安裝進度還沒有增加百分之一?或者是在使用的時候移動一下鼠標帶來的就是“嘩嘩”的硬盤響聲?所以對于那些機器不夠棒的朋友,還是建議你采用后面說到的兩種方法。
二、CMOS修改
如果你使用的是Windows 98操作系統,那么可以在CMOS中將第二硬盤的選項設置為“NONE”。比如掛接在第一根硬盤線的Slave端,就在CMOS中設置“IDE Primary Slave”為“NONE”,這樣在開機的時候系統會省去對第二硬盤的查找,進入Windows 98之后,你會發現第二塊硬盤已經被找到,而且交叉盤符的現象也不復存在。
不過遺憾的是,這種方法只有在Windows 98操作系統下才能實現的,如果你使用Windows 95就不能享受這種便利的設置優勢了。而且即使你采用的是Windows 98系統,只要切換到DOS狀態的時候,第二硬盤就會自動消失,要是你需要經常在DOS下處理文件,那么這種方法還不是最佳的解決之道。
三、分區大法
事到如今,還有最后一招,保管你一勞永逸,絕無后顧之憂,這就是對第二塊重新分區。采用這種方法,無論在什么操作系統下,CMOS中如何設置,都可以解決盤符交叉的問題。想必這就是大家所最為關注的,所以在此對其的操作步驟介紹一下。
1、將兩塊硬盤安裝好之后,開機的時候按下“F8”鍵并選擇相應的選項進入DOS狀態。
2、鍵入“Fdisk”,然后會看見分區主界面,其中比以往大家所看見的多出了第五個選項“Change current fixed disk drive”,選擇此項之后按回車鍵繼續。
3、接下來看見的是硬盤以及分區列表,這時大家選中第二個硬盤,然后按照先刪除擴展分區,再刪除主分區的步驟將這塊硬盤上的分區刪除。
4、在對第二硬盤重新建立分區的時候要注意,一定不能選擇“Create Primary DOS Partition”在這塊硬盤上創建主分區,而要選擇“Create Extended DOS Partition”把所有的空間都分配給擴展分區使用。接著再按照自己的需要把這個硬盤分為多個分區。
5、分區完畢之后,重新啟動計算機,等進入Windows之后調用資源管理器會發現原先交叉的盤符現在已經老老實實的按照規矩排列了,這時再對它們進行格式化處理,這塊第二硬盤就可以像原先的那塊一樣正常使用了。
但是這種方法也有一個缺點,就是會完全破壞第二硬盤上的數據,不過說起來也好解決,現在的硬盤都是又平又靚(又便宜又好)了,像主流的20G硬盤,只要八百多元,完全可以把你早期只有1G多的內容全部復制過來了吧。
好了,到此為止,解決雙硬盤盤符交叉的三種方法全部告訴大家了,至于你選用哪一種就看你自己的實際情況了。
首先了解什么是IIS連接數。
IIS連接數指并發連接數,什么意思呢?
要分幾種情況:(以100M空間50人在線為例)
A 用戶單點下載你的文件,結束后正常斷開,這些連接是按照瞬間計算的,就是說你50人的網站瞬間可以接受同時50個點下載
B 用戶打開你的頁面,就算停留在頁面沒有對服務器發出任何請求,那么在用戶打開一面以后的15分鐘內也都要算一個在線,就是說你50人的網站15分鐘內可以接受不同用戶打開50個頁面
C 上面B的情況用戶繼續打開同一個網站的其他頁面,那么在線人數按照用戶最后一次點擊(發出請求)以后的15分鐘計算,在這個15分鐘內不管用戶怎么點擊(包括新窗口打開)都還是一人在線。
D 當你的頁面內存在框架(Iframe),那么每多一個框架就要多一倍的在線!因為這相當于用戶同一時間向服務器請求了多個頁面。
E 當用戶打開頁面然后正常關閉瀏覽器,用戶的在線人數也會馬上清除。
然后了解什么是論壇在線人數。
論壇在線只是計算一定時間內的活動用戶數。
這里的時間用戶可以自己設定(刪除不活動用戶時間),動網論壇默認為40分鐘的相對準確值。
根據上面的說明,顯然論壇在線和IIS連接數的概念不同
為什么會出現IIS連接數和論壇在線不符合的情況?
現具體分析如下:
1:您使用了插件版論壇!
現在的插件很**,不但占服務器資源,而且會使論壇運行變慢( 沒有插件可以快一倍以上 ),同時很占在線人數,有的插件調用很多框架,少則2、3個,多則4、5個! 甚至有在線播放音樂,這樣一個人在線就相當與很多人在線!
2:您的網站是主頁+論壇的形式!
這樣主頁和論壇要爭奪你的在線人數!
3:你的論壇內部有播放器!
一個人在線,然后他在線播放音樂,就占二個人在線!
4:你的論壇內部存在框架形式的網頁!
每一個框架,就多一倍的在線!
5:你的論壇設置在線時間過小!
動網默認為40分鐘, 這個默認值下,一般我們20IIS的學習型主機可以達到50人左右 ,因為論壇在線只是計算一定時間內的活動用戶數,當您設定的時間較小的時候,看起來論壇在線的人數就自然少了,請把 刪除不活動用戶時間 改為默認的40分鐘就可以!
6:你的空間存在多個論壇!
有的客戶在一個空間里上傳多個論壇,如bbs bbs1 bbs2 等等 等等
毫無疑問,這樣個論壇也是要爭奪再線人數的!
7:你的論壇圖片等文件被人盜鏈!
比如:你的論壇有張圖片文件,被粘貼(注意是粘貼不是上傳)到別的論壇!
別的論壇的用戶在瀏覽該文件的時候也算一個在線人數!
尤其是LOGO連接的時候注意,一定要對方把您的LOGO上傳到他的空間!
8:你的空間上放有下載文件!
如果用戶用網絡螞蟻類的軟件,每一個線程就表示一個在線,非常厲害
9:最新發現如果網站首頁直接調用論壇的新帖子可能導致IIS超出標準建議網站使用靜態頁面
<%
'------------------------------------------------------------------------
'-------------------無垠網域:http://www.5inet.net/ ---------------------
'-------------------作者:嘻哈呵嘿 ,webmaster@5inet.net -----------------
'----------遠程獲取內容,并將內容存在本地電腦上,包括任何文件!----------
'---------------利用xmlhttp和adodb.stream,酷!絕對原創!-----------------
'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
'--------------------否則為遠程文件,交給RemoteFile處理------------------
RemoteFile(Path)
end if
'Response.Write err.Description
sub LocalFile(Path)
'-------------------如果為本地文件則簡單的跳轉到該頁面-------------------
Response.Redirect Path
End Sub
Sub RemoteFile(sPath)
'-------------------------處理遠程文件函數------------------------------
FileName = GetFileName(sPath)
'-------------GetFileName為把地址轉換為合格的文件名過程-------------
FileName = Server.MapPath("/UploadFile/Cache/" & FileName)
Set objFso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write fileName
if objFso.FileExists(FileName) Then
'--------------檢查文件是否是已經訪問過,如是,則簡單跳轉------------
Response.Redirect "/uploadfile/cache/" & GetFileName(path)
Else
'----------------否則的話就先用GetBody函數讀取----------------------
'Response.Write Path
t = GetBody(Path)
'-----------------用二進制方法寫到瀏覽器上--------------------------
Response.BinaryWrite t
Response.Flush
'-----------------輸出緩沖------------------------------------------
SaveFile t,GetFileName(path)
'------------------將文件內容緩存到本地路徑,以待下次訪問-----------
End if
Set objFso = Nothing
End Sub
Function GetBody(url)
'-----------------------本函數為遠程獲取內容的函數---------------------
'on error resume next
'Response.Write url
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
'----------------------建立XMLHTTP對象-----------------------------
With Retrieval
.Open "Get", url, False, "", ""
'------------------用Get,異步的方法發送-----------------------
.Send
'GetBody = .ResponseText
GetBody = .ResponseBody
'------------------函數返回獲取的內容--------------------------
End With
Set Retrieval = Nothing
'response.Write err.Description
End Function
Function GetFileName(str)
'-------------------------本函數為合格化的文件名函數-------------------
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)
'-------------------------本函數為將流內容存盤的函數-------------------
'on error resume next
Set objStream = Server.CreateObject("ADODB.Stream")
'--------------建立ADODB.Stream對象,必須要ADO 2.5以上版本---------
objStream.Type = adTypeBinary
'-------------以二進制模式打開-------------------------------------
objStream.Open
objstream.write str
'--------------------將字符串內容寫入緩沖--------------------------
'response.Write fname
objstream.SaveToFile "c:\inetpub\myweb\uploadfile\cache\" & fName,adSaveCreateOverWrite
'--------------------將緩沖的內容寫入文件--------------------------
'response.BinaryWrite objstream.Read
objstream.Close()
set objstream = nothing
'-----------------------關閉對象,釋放資源-------------------------
'response.Write err.Description
End sub
%>