轉帖|其它|編輯:郝浩|2011-07-18 14:59:00.000|閱讀 426 次
概述:讓我們先分析一般的瀏覽現象,其中最重要的一點就是一個完整的頁面并不是一次全部傳送到客戶端的。如果你請求的是一個帶有許多圖片和其它信息的頁面,那么最先的一個Http請求被傳送回來的是這個頁面的文本,然后通過客戶端的瀏覽器對這段文本的解釋執行,發現其中還有圖片,那么客戶端的瀏覽器會再發送一條 Http請求,當這個請求被處理后那么這個圖片文件會被傳送到客戶端,然后瀏覽器回將圖片安放到頁面的正確位置,就這樣一個完整的頁面也許要經過發送多條 Http請求才能夠被完整的顯示。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
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還有其他的應用,在此我們就不贅述了,下面的工作就需要讀者多多實踐了,并從中學習到更多的東西獲得更多的經驗,更好地應用設計開發的需求
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載