ASP.NET圖片盜鏈問題

 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請求進行處理的。

[code=c#]
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();//將服務器端爲此會話開闢的輸出緩存中的信息傳送到客戶端
}
}
[/code]

  OK,現在你已經對此方法有一定的瞭解了,其實自定義HttpHandler還有其他的應用,在此我們就不贅述了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章