使用SERVER.TRANSFER对URL进行隐藏以及其他
类别: ASP教程
我的初步想法是:在一个xml文件中记录所有的名称-地址对照集合,然后在default.asp中读取这个集合,在查询字符串的pg中读取page name, 然后Server.Transfer到相应的页面中。关键代码如下:
default.asp:
<!--#include file="Functions.asp"-->
<%
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, xmlDom, root
Set xmlDom = Server.CreateObject("Microsoft.XMLDOM")
xmlDom.async = False
xmlDom.load(configPath)
Set root = xmldom.selectSingleNode("//url-mappings")
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.Source & "<br>"
Response.Write Err.Description & "<br>"
End If
End Function
%>
app-conf.xml
<?xml version="1.0"?>
<app-conf>
<url-mappings>
<url-mapping>
<page-name>pgHome</page-name>
<page-url>Page2.asp</page-url>
</url-mapping>
<url-mapping>
<page-name>pgShowNews</page-name>
<page-url>shownews-1_0.asp</page-url>
</url-mapping>
<url-mapping>
<page-name>pgHtml</page-name>
<page-url>1.html</page-url>
</url-mapping>
</url-mappings>
</app-conf>
3 实践与问题
在浏览器中输入http://localhost:12345/default.asp?pg=pgHome
http://localhost:12345/default.asp?pg=pgShowNews 看出各个较大不同的页面之间地址都相同,没有明显转向的感觉。我在一个页面作了遍历Request.Form, Request.QueryString的测试,都能够取得相应的值。
问题:
要转向的页面如果处在其他目录下,并且如果在该页面中有对../上级目录或其他目录的引用(如样式表,图片等),则显示不出来。我想这可能是Server.Transfer实际是将整个文件包含到当前路径来执行。这样图片、样式等的显示就会有问题了。也就是说,如果想应用这种方法在整个系统中,则需要将所有的页面文件(asp, html)置于与default.asp(或者其他控制转向的文件)同一文件夹下。这或多或少是个限制。
4 优点:
利用这种方式最直接的优点就是将链接与文件名隔开。你不需要费尽心思的想该怎么取一个文件名,也不需要花气力去检查链接地址的正确性。只要在xml文件中将pageName与pageURL进行映射就行了。
第二个优点是安全,用户无法知道你真正的URL地址。你也可以在default.asp中加入一些控制,使得直接访问xxx.asp的用户被转入到一个出错页面。
第三个优点是易于管理。通过将文件名―文件路径进行映射,你能够更加清楚整个项目的流程。如果你愿意,你可以将页面所带的参数也进行标准化。这样,对于ASP项目也能够规范化了,例如,一个典型的页面地址:
http://etoow.com/default.asp?pg=pgNewsList&command=List&sp=1&sp=abc
通过将页面名称、参数的规范化,使得程序员可以更加清楚的编写整个页面。项目管理者可以通过掌握整个xml的配置文件(当然,参数信息、页面描述等也应当记录在这个文件中)可以迅速把握整个项目的脉络。这也在一定程度上控制了随意添加文件的问题。
default.asp:
<!--#include file="Functions.asp"-->
<%
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, xmlDom, root
Set xmlDom = Server.CreateObject("Microsoft.XMLDOM")
xmlDom.async = False
xmlDom.load(configPath)
Set root = xmldom.selectSingleNode("//url-mappings")
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.Source & "<br>"
Response.Write Err.Description & "<br>"
End If
End Function
%>
app-conf.xml
<?xml version="1.0"?>
<app-conf>
<url-mappings>
<url-mapping>
<page-name>pgHome</page-name>
<page-url>Page2.asp</page-url>
</url-mapping>
<url-mapping>
<page-name>pgShowNews</page-name>
<page-url>shownews-1_0.asp</page-url>
</url-mapping>
<url-mapping>
<page-name>pgHtml</page-name>
<page-url>1.html</page-url>
</url-mapping>
</url-mappings>
</app-conf>
3 实践与问题
在浏览器中输入http://localhost:12345/default.asp?pg=pgHome
http://localhost:12345/default.asp?pg=pgShowNews 看出各个较大不同的页面之间地址都相同,没有明显转向的感觉。我在一个页面作了遍历Request.Form, Request.QueryString的测试,都能够取得相应的值。
问题:
要转向的页面如果处在其他目录下,并且如果在该页面中有对../上级目录或其他目录的引用(如样式表,图片等),则显示不出来。我想这可能是Server.Transfer实际是将整个文件包含到当前路径来执行。这样图片、样式等的显示就会有问题了。也就是说,如果想应用这种方法在整个系统中,则需要将所有的页面文件(asp, html)置于与default.asp(或者其他控制转向的文件)同一文件夹下。这或多或少是个限制。
4 优点:
利用这种方式最直接的优点就是将链接与文件名隔开。你不需要费尽心思的想该怎么取一个文件名,也不需要花气力去检查链接地址的正确性。只要在xml文件中将pageName与pageURL进行映射就行了。
第二个优点是安全,用户无法知道你真正的URL地址。你也可以在default.asp中加入一些控制,使得直接访问xxx.asp的用户被转入到一个出错页面。
第三个优点是易于管理。通过将文件名―文件路径进行映射,你能够更加清楚整个项目的流程。如果你愿意,你可以将页面所带的参数也进行标准化。这样,对于ASP项目也能够规范化了,例如,一个典型的页面地址:
http://etoow.com/default.asp?pg=pgNewsList&command=List&sp=1&sp=abc
通过将页面名称、参数的规范化,使得程序员可以更加清楚的编写整个页面。项目管理者可以通过掌握整个xml的配置文件(当然,参数信息、页面描述等也应当记录在这个文件中)可以迅速把握整个项目的脉络。这也在一定程度上控制了随意添加文件的问题。
- 上一篇: 使用ADO的批量更新方法UPDATEBATCH
- 下一篇: 结合ASP和存储过程做的搜索程序
-= 资 源 教 程 =-
文 章 搜 索