使用Server.Transfer對URL進行隱藏以及其他 (轉)

amyz發表於2007-11-26
使用Server.Transfer對URL進行隱藏以及其他 (轉)[@more@]

使用Server.Traner對URL進行隱藏以及其他

年8月29日

 

1 問題提出

經常看到一些網站或者應用,在看來,他們只採用一個頁面,所有的頁面地址都是透過這個頁面的引數連結得到的。例如:

  ?pg=AdminPage&command=View

  asp?pg=ShowPage&command=List

等等諸如此類的東西。以前我沒有仔細想過該怎麼實現,也許頁面差別不大用幾個不同的Sub來做就行了;可是仔細看了看兩個地址,兩個頁面的差別太大了;如果這一個頁面包含這麼多的Sub,這對員而言簡直是一種摧殘,而且美工根本無法插手。我和一個網友討論了很久,他提出用IS,我覺得很恐怖。

:namespace prefix = o ns = "urn:schemas--com::office" />

後來想了想,記起來轉向的幾種方法:Server.Transfer, Response.Redirect, Server.Execute就不算了。Response.Redirect是IIS明確表明不太用的(但是我以前做ASP的時候用得最多)。後來看看Server.Transfer,越看越覺得能夠使用的樣子。IIS的幫助中進行了如下闡述:

When you call Server.Transfer, the state information for all the built-in s will be included in the transfer. This means that any variables or objects that have been assigned a value in session or application pe will be maintained. In addition, all of the current contents for the request collections will be available to the .asp file receiving the transfer. 也就是說,所有的Request集合、Session、Application都是共享的。這樣就能夠在不同的頁面進行互動了。

看到這些,我就動手做了一些程式碼,闡述如下:

2 實現

我的初步想法是:在一個xml中記錄所有的名稱-地址對照集合,然後在default.asp中讀取這個集合,在查詢字串的pg中讀取page name, 然後Server.Transfer到相應的頁面中。關鍵程式碼如下:

default.asp:

<!--#include file="Functions.asp"--&gt

  On Error Resume Next

  Response.CharSet = "gb2312"

  Dim opageName, opageURL

  opageName = Request.QueryString("pg")

  If opageName <> "" Then

  opageURL = GetPage(opageName)

  Else

  Response.Write "OKOK, You didn't pass a pg parameter."

  Response.End

  End If

 

  If opageURL = "" Then

  Response.Write "找不到對映檔案for: " & opageName

  Else

  Server.Transfer(opageURL)

  End If

  If Err.Number <> 0 Then

  Response.Write Err.Description

  End If

%>

Functions.asp:

Option Explicit

Dim configPath, Page_URL_Dict

configPath = Server.MapPath("./conf/app-conf.xml")

Set Page_URL_Dict = Server.CreateObject("Scripting.Dictionary")

‘根據pageName取得頁面地址

Function GetPage(pageName)

 

  If Page_URL_Dict.Count = 0 Then

  ReadPageURLToDict

  End If

  GetPage = Page_URL_Dict(pageName)

End Function

‘初始化pageName-pageURL對照字典

Function ReadPageURLToDict()

  On Error Resume Next

  Page_URL_Dict.RemoveAll

  Dim logNode, xml,

  Set xmlDom = Server.CreateObject("Microsoft.XMLDOM")

  xmlDom.async = False

  xmlDom.load(configPath)

  Set root = xmldom.SingleNode("//url-maps")

  For Each logNode In root.childNodes

  Page_URL_Dict.Add logNode.childNodes(0).text, logNode.childNodes(1).text

  Next

 

  Set xmlDom = Nothing

  If Err.Number <> 0 Then

  Response.Write Err. & "
"

  Response.Write Err.Description & "
"

  End If

End Function

%>

app-conf.xml

 

   

  pgHome

  Page2.asp

 

 

  pgShowNews

  shownews-1_0.asp

 

 

  pgHtml

  1.html

 

 

3 實踐與問題

在瀏覽器中輸入

看出各個較大不同的頁面之間地址都相同,沒有明顯轉向的感覺。我在一個頁面作了遍歷Request.Form, Request.QueryString的測試,都能夠取得相應的值。

問題:

要轉向的頁面如果處在其他目錄下,並且如果在該頁面中有對../上級目錄或其他目錄的引用(如樣式表,圖片等),則顯示不出來。我想這可能是Server.Transfer實際是將整個檔案包含到當前路徑來。這樣圖片、樣式等的顯示就會有問題了。也就是說,如果想應用這種方法在整個系統中,則需要將所有的頁面檔案(asp, html)置於與default.asp(或者其他控制轉向的檔案)同一資料夾下。這或多或少是個限制。

4 優點:

利用這種方式最直接的優點就是將連結與檔名隔開。你不需要費盡心思的想該怎麼取一個檔名,也不需要花氣力去檢查連結地址的正確性。只要在xml檔案中將pageName與pageURL進行對映就行了。

第二個優點是,無法知道你真正的URL地址。你也可以在default.asp中加入一些控制,使得直接訪問xxx.asp的使用者被轉入到一個出錯頁面。

第三個優點是易於管理。透過將檔名—檔案路徑進行對映,你能夠更加清楚整個專案的流程。如果你願意,你可以將頁面所帶的引數也進行標準化。這樣,對於ASP專案也能夠規範化了,例如,一個典型的頁面地址:

asp?pg=pgNewsList&command=List&sp=1&sp=abc

透過將頁面名稱、引數的規範化,使得程式設計師可以更加清楚的編寫整個頁面。者可以透過掌握整個xml的檔案(當然,引數資訊、頁面描述等也應當記錄在這個檔案中)可以迅速把握整個專案的脈絡。這也在一定程度上控制了隨意新增檔案的問題。

當然,以上只是我的一些想法,畢竟現在不做ASP了,很多想法不知道能否真正實現。還希望大家一起來交流。E: mechiland@163


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-984970/,如需轉載,請註明出處,否則將追究法律責任。

相關文章