文章出處

簡介

Server對象是HttpServerUtility的一個實例,也是上下文對象context的一個屬性,提供用于處理Web請求的Helper方法。

 


 

 

常用成員

 

一、Server.MapPath()方法

方法簽名:public string MapPath(string path)

描述:指定一個虛擬路徑傳入,返回對應虛擬路徑的Web服務器上的物理路徑。等同于Request.MapPath()方法。

 

二、Server.Execute()方法

方法簽名:public void Execute(string path)

描述:在當前請求的上下文中執行指定虛擬路徑的處理程序,然后執行返回給調用它的頁面。

通俗的說,也就是當前頁面調用了Server.Execute方法將一個指定路徑的頁面進行執行,將內容嵌套在當前頁面中,可以實現iframe類似的效果。

示例圖解:

 

WebForm2.apx內容:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <% Response.Write("我是頁面2"); %>
    </div>
    </form>
</body>
</html>

 

 

讓我們這通過一張圖片看看執行原理:

從查看網頁源代碼,可以看出,Execute方法將指定路徑的頁面執行輸出,作為頁面中的一部分進行顯示,此技術完全可以實現類似iframe的功能,父頁面中嵌套一個子頁面

 

 

 

三、Server.Transfer()方法

方法簽名:public void Tarnsfer(string path)

描述:對于當前請求(當前頁面),終止當前頁的執行,并根據傳入的URL執行新的頁面。

其實Server.Transfer()方法可以看做是一個內部的重定向,是由服務器內部的資源接管,

瀏覽器察覺不到該請求,Htpp報文里也無法查看到請求信息。還要注意的是該方法重定向請求的頁面資源必須是服務器內部的,不能重定向外部的網站。

 

示例圖解:

在執行結束后瀏覽器的地址欄不會發生變化,因為是內部的,瀏覽器不知道,所以地址欄還是轉移之前頁面的url地址

 

俗解:

Server.Transfer就好比一個公交站點,一輛596公交車帶著一批乘客開到了這個站點,就表示說,要換另一個司機了,

新的司機上車,跟著新司機又有一批新的乘客,就繼續駕駛著這個596公交車。頁面的Url是沒有改變的,Url就像沒有改變的公交車線路號(596)。

 

注意:還有一點需要注意的是該方法不能重定向到ashx的一般處理程序頁面,否則會報“子查詢出錯”

 

 

四、Server.Execute()、Server.Transfer()和Response.Redirect()的區別

 

 

1.從三者字面意上就是就可以看出三個方法的核心,那么根據關鍵字簡單概括一下:

 

Server.Execute():執行。根據傳入的指定路徑,在當前頁面執行該路徑對應的頁面,此內容作為頁面的一部分。

 

Server.Transfe():轉移。在方法執行處,結束當前請求輸出的內容,轉移到一個指定頁面,輸出新頁面的內容。

 

Response.Redirect():重新寄送。接收客戶端請求后執行該方法后,返回給瀏覽器304狀態碼,讓瀏覽器在發一次http請求,請求Redirect()方法指定路徑的頁面。

 

 

 

2.三者的共同點:

 

都可以指定一個路徑參數,然后根據這個路徑,實現跳轉執行路徑對應的頁面。

 

 

 

3.地址欄的區別:

 

Server.Execute()和Server.Transfer()方法執行輸出后,瀏覽器的地址欄不會改變,還是當前請求的地址。

然而Response.Redirect()則會告訴瀏覽器在一起發送一個http請求,最終地址欄會發送改變,地址欄為Redirect()方法參數路徑的地址。

 

 

 

4.Server.Execute()和Server.Transfer()區別:

 

兩則表面上非常相似,執行后地址欄未改變,執行結果也很類似。其實兩者有本質上的區別,

Server.Execute()其實是執行一個頁面,執行輸出在當前頁面中,當前頁面下部分還要輸出的。

但是,Server.Transfer()方法執行,當前頁面的請求輸出就中斷了,轉移給另一個頁面了,下部分顯示的是另一個頁面的內容。

 

 

 

5.Server.Transfer()和Response.Redirect()的區別:

 

兩者形式上相同,都是重定向到另一個資源。Response.Redirect()方法執行后會返回給瀏覽器一個304狀態碼,

瀏覽器根據指定的路徑在發送一次http請求。如果請求的頁面執行Response.Redirect()方法,其實在http報文里可以看到相關線索的。

然后Server.Transfer()是一個內部的重定向,瀏覽器無法察覺它的操作,Http報文里也無法看到相關線索。

還有一點是,Redirect可以傳一個外部的地址,重定向外部的網站,然而Transfer只能限定說,傳入的路徑資源必須是服務器內部的。Redirect方法相對比較靈活。

 

 

 

 

 

五、Server.HtmlEncode()方法

方法簽名:public string HtmlEncode(string s)

描述:一個字符串內容如果包含html標簽,那么輸出到客戶端瀏覽器會解析成一個html標簽,

如果我們不想讓這個含有html內容的字符串輸出成標簽,而是輸出字符串內容,那么使用Server.HtmlEncode()方法就可以實現。

實例圖片:

注意:原模原樣的輸出了字符串內容,而不是解析成一個Html標簽,實際上Encode()方法將那些有html字符替代用特殊的轉義字符表示

 

 

Server.HtmlEncode()方法實際運用的情況1

假設我們項目中有一個評論功能,這個時候如果用戶評論的內容,是有特殊含義的JavaScript腳本,如果順利執行保存到數據庫中,

又恰好讀取評論這個頁面向服務器反應的   context.Response.ContentType = "text/html";這種形式,

那么用戶在讀取查看這個評論的時候,腳本就會執行,那么我們很可能存在一個風險,被這個腳本有意圖的打亂系統運行。

這個時候,我們可以使用Server.HtmlEncode()方法評論內容進行處理,只是讓參數本分純粹的將內容以字符串形式表示。

 

 

Server.HtmlEncode()實戰示例情況2:

需求:一個程序員社區,需要大家分享代碼交流,提供了相應提交評論和讀取評論的功能

界面:

 

后臺服務器接收到該參數的時候,.net平臺會報一個錯誤,如圖:

這說明,.net對客戶端提交的參數,有一道檢驗的屏障,但是根據功能設計,這里提交的腳本代碼我認為是安全的,那么就要關閉.net的這個屏障。

 

如何關閉:

一、將配置文件里httpRuntime標簽下的requestValidationMode設置為2.0

 

二、這Page指令集處設置ValidateRequest屬性為false(此處只是針對WebForm程序的設定,其他應用請參考https://msdn.microsoft.com/en-us/library/hh882339.aspx

 

這樣,服務器就可以把有代碼含義的內容保存到數據庫,在讀取評論的時候,我們對這個有代碼含義的內容使用Server.HtmlEncode()方法,將他響應給瀏覽器,瀏覽器就可以顯示這個包含代碼含義的字符串,為什么讀取的時候使用Server.HtmlEncode()方法因為默認Response.write()肯會將內容轉義交給瀏覽器,瀏覽器會執行這個代碼腳本。

 

 

 

 

六、Server.HtmlDecode()方法

方法簽名:public string HtmlDecode(string s)

描述:將一個含有html內容含義的字符串,解析成一個html標簽輸出給瀏覽器

實例圖片:

 

根據Encode()方法推理,Encode()方法內部實際上把字符串里那些有html含義的字符,替代成特殊轉義字符進行顯示,那么HtmlDecode()方法同樣可以把含義轉義字符的字符串解析成html標簽,如圖:

 

注意:服務器調用context.Response.Write()方法輸出一個字符串,如果字符串是html含義的,

那么服務器默認使用的是Server.HtmlDecode()方法輸出給瀏覽器,當然這個還要看Context.Response.ContentType屬性的設置

 

 

 

七、Server.UrlEncode()方法和Server.UrlDecode()方法

Server.UrlEncode():傳一個url格式的字符串,對url進行編碼,通俗的理解為加密

Server.UrlDecode():對Server.UrlEncode()編碼加密過后的Url進行解碼,還原本來面目

示例圖解:

 

結論:兩個方法的特點,我們可以在請求一些重要頁面的時候,使用編碼解碼的方法來提高,請求URL地址的安全性。

 

 

 

 


 

以上知識點根據學習,不斷領悟后對知識不斷的剖解

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()