簡介
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地址的安全性。
以上知識點根據學習,不斷領悟后對知識不斷的剖解
文章列表