標籤:
簡介
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地址的安全性。
以上知識點根據學習,不斷領悟後對知識不斷的剖解
ASP.NET常用內建對象之——Server