1什麼是圖片盜鏈
讓我們先分析一般的瀏覽現象,其中最重要的一點就是一個完整的頁面並不是一次全部傳送到用戶端的.如果你請求的是一個帶有許多圖片和其它資訊的頁面,那麼最先的一個Http請求被傳送回來的是這個頁面的文本,然後通過用戶端的瀏覽器對這段文本的解釋執行,發現其中還有圖片,那麼用戶端的瀏覽器會再發送一條Http請求,當這個請求被處理後那麼這個圖片檔案會被傳送到用戶端,然後瀏覽器回將圖片安放到頁面的正確位置,就這樣一個完整的頁面也許要經過發送多條Http請求才能夠被完整的顯示.基於這樣的機制,就會產生一個問題,那就是盜鏈問題: 就是一個網站中如果沒有起頁面中所說的資訊,例片資訊,那麼它完全可以將這個圖片的串連到別的網站.這樣沒有任何資源的網站利用了別的網站的資源來展 示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的.
2 解決方案
那麼現在利用ASP.NET中的這HttpHandler能夠很好地解決這個問題,之所以能夠發生這個問題.就是因為我們在預設狀態下只處理那些動態網頁,象asp,aspx等等,但當有請求一個圖片檔案時,IIS就會直接提取資源並發送給用戶端,這樣看來就顯得有些盲目了吧
所以我們要建立自己的HttpHandler來處理圖片檔案。例如jpg檔案。
3 那麼我們如何建立自己的HttpHandler並在web應用程式中註冊呢?
(1)建立自己的HttpHandler
建立一個繼承了System.Web.IHttpHandler介面的類,在System.Web.IHttpHandler介面只有兩個成員
1 IsReusable 屬性,其返回一個值代表其他http請求是否可以使用當前繼承了 System.Web.IHttpHander介面的類的執行個體。
2 ProcessRequest(System.Web.HttpContext context) 方法,除了使用者自訂中被要求處理的特殊的http請求。
其中的參數 System.Web.HttpContext 類的執行個體裝入了一個http請求中http協議中要求的所有資訊。其中System.Web.HttpContext 類中包含有屬性 Request 使得從用戶端發送過來的http請求資訊的值可以被方便地讀取;屬性Response ,其中封裝了需要返回給用戶端的資訊和操作。當然還有許多常用的屬性和方法,在此就不詳述了,我們這裡只用到這兩個屬性。
(2)web應用程式中註冊自訂的HttpHandler
在 Web.config這個網路應用程式設定檔中加入註冊資訊
<httpHandlers> <add verb = " path = "*.jpg" type = "自訂handler的類的名稱,網路應用程式名稱" /> </httpHandlers> |
4 那麼我們看看在ProcessRequest(System.Web.HttpContext context)方法是如何對請求圖片檔案的http請求進行處理的。
public void ProcessRequest(System.Web.HttpContext context) { if(context.Request.UrlReferrer.Host == "www.frontfree.net")//判斷是否是本地引用,如果是則返回給用戶端正確的圖片,這裡的判斷就是用到了前面所述的http請求中所記路的參考頁資訊 { context.Response.Expires = 0;//設定用戶端緩衝中檔案到期時間為0,即立即到期。 context.Response.Clear();//清空伺服器端為此會話開闢的輸出緩衝 context.Response.ContentType = getContentType(context.Request.PhysicalPath); //獲得檔案類型 context.Response.WriteFile(context.Request.PhysicalPath);//將請求檔案寫入到伺服器端為此會話開闢的輸出緩衝中 context.Response.End();//將伺服器端為此會話開闢的輸出緩衝中的資訊傳送到用戶端 } Else //如果不是本地引用,則屬於盜鏈引用,返回給用戶端錯誤的圖片 { context.Response.Expires = 0; //設定用戶端緩衝中檔案到期時間為0,即立即到期。 context.Response.Clear();//清空伺服器端為此會話開闢的輸出緩衝 context.Response.ContentType = getContentType("error.jpg"); //獲得檔案類型 context.Response.WriteFile("error.jpg");//將特殊的報告錯誤的圖片檔案寫入到伺服器端為此會話開闢的輸出緩衝中 context.Response.End();//將伺服器端為此會話開闢的輸出緩衝中的資訊傳送到用戶端 } } |
5 待這一切都做好了,我們還要在讓IIS知道,遇到圖片檔案也要進行處理。
這件事情我們還要讓IIS知道.而為什麼aspx檔案會被處理,而預設的那些可以處理aspx的HttpHandler在哪裡,其實是因為IIS在接收到aspx頁面請求時,會為其自動載入一個C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll檔案,這個檔案是專為處理aspx頁面所用的,是.NET Framework的一部份,我們要IIS在接收到jpg檔案請求時也為其載入這個dll檔案。
我們首先添加一個處理,讀者可以參考aspx檔案的配置就可以對處理jpg檔案進行配置,我們同樣也為jpg檔案載入aspnet_isapi.dll檔案,因為我們對jpg檔案的處理也是建立在 ASP.NET機制之上的。具體配置,如:
OK,現在你已經對此方法有一定的瞭解了,其實自訂HttpHandler還有其他的應用,在此我們就不贅述了,下面的工作就需要讀者多多實踐了,並從中學習到更多的東西獲得更多的經驗,更好地應用設計開發的需求。