ASP.NET運(yùn)行機(jī)制和圖片盜鏈問題 1什么是圖片盜鏈
讓我們先分析一般的瀏覽現(xiàn)象,其中最重要的一點(diǎn)就是一個(gè)完整的頁面并不是一次全部傳送到客戶端的。如果你請求的是一個(gè)帶有許多圖片和其它信息的頁面,那么最先的一個(gè)Http請求被傳送回來的是這個(gè)頁面的文本,然后通過客戶端的瀏覽器對這段文本的解釋執(zhí)行,發(fā)現(xiàn)其中還有圖片,那么客戶端的瀏覽器會再發(fā)送一條Http請求,當(dāng)這個(gè)請求被處理后那么這個(gè)圖片文件會被傳送到客戶端,然后瀏覽器回將圖片安放到頁面的正確位置,就這樣一個(gè)完整的頁面也許要經(jīng)過發(fā)送多條Http請求才能夠被完整的顯示?;谶@樣的機(jī)制,就會產(chǎn)生一個(gè)問題,那就是盜鏈問題:就是一個(gè)網(wǎng)站中如果沒有起頁面中所說的信息,例如圖片信息,那么它完全可以將這個(gè)圖片的連接到別的網(wǎng)站。這樣沒有任何資源的網(wǎng)站利用了別的網(wǎng)站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發(fā)現(xiàn),這樣顯然,對于那個(gè)被利用了資源的網(wǎng)站是不公平的。 2 解決方法 那么現(xiàn)在利用ASP.NET中的這HttpHandler能夠很好地解決這個(gè)問題,之所以能夠發(fā)生這個(gè)問題。就是因?yàn)槲覀冊谀J(rèn)狀態(tài)下只處理那些動態(tài)的網(wǎng)頁,象asp,aspx等等,但當(dāng)有請求一個(gè)圖片文件時(shí),IIS就會直接提取資源并發(fā)送給客戶端,這樣看來就顯得有些盲目了吧 所以我們要創(chuàng)建自己的HttpHandler來處理圖片文件。例如jpg文件。 3 那么我們?nèi)绾谓⒆约旱腍ttpHandler并在web應(yīng)用程序中注冊呢? ?。?)建立自己的HttpHandler 創(chuàng)建一個(gè)繼承了System.Web.IHttpHandler接口的類,在System.Web.IHttpHandler接口只有兩個(gè)成員 1 IsReusable 屬性,其返回一個(gè)值代表其他http請求是否可以使用當(dāng)前繼承了 System.Web.IHttpHander接口的類的實(shí)例。 2 ProcessRequest(System.Web.HttpContext context) 方法,除了用戶自定義中被要求處理的特殊的http請求。 其中的參數(shù) System.Web.HttpContext 類的實(shí)例裝入了一個(gè)http請求中http協(xié)議中要求的所有信息。其中System.Web.HttpContext 類中包含有屬性 Request 使得從客戶端發(fā)送過來的http請求信息的值可以被方便地讀取;屬性Response ,其中封裝了需要返回給客戶端的信息和操作。當(dāng)然還有許多常用的屬性和方法,在此就不詳述了,我們這里只用到這兩個(gè)屬性。 (2)web應(yīng)用程序中注冊自定義的HttpHandler。 在 Web.config這個(gè)網(wǎng)絡(luò)應(yīng)用程序配置文件中加入注冊信息。 4 那么我們看看在ProcessRequest(System.Web.HttpContext context)方法是如何對請求圖片文件的http請求進(jìn)行處理的。 public void ProcessRequest(System.Web.HttpContext context) context.Response.Expires = 0;//設(shè)置客戶端緩沖中文件過期時(shí)間為0,即立即過期。 context.Response.Clear();//清空服務(wù)器端為此會話開辟的輸出緩存 context.Response.ContentType = getContentType(context.Request.PhysicalPath); //獲得文件類型 context.Response.WriteFile(context.Request.PhysicalPath);//將請求文件寫入到服務(wù)器端為此會話開辟的輸出緩存中 context.Response.End();//將服務(wù)器端為此會話開辟的輸出緩存中的信息傳送到客戶端 Else //如果不是本地引用,則屬于盜鏈引用,返回給客戶端錯誤的圖片 context.Response.Expires = 0; //設(shè)置客戶端緩沖中文件過期時(shí)間為0,即立即過期。 context.Response.Clear();//清空服務(wù)器端為此會話開辟的輸出緩存 context.Response.ContentType = getContentType("error.jpg"); //獲得文件類型 context.Response.WriteFile("error.jpg");//將特殊的報(bào)告錯誤的圖片文件寫入到服務(wù)器端為此會話開辟的輸出緩存中 context.Response.End();//將服務(wù)器端為此會話開辟的輸出緩存中的信息傳送到客戶端 5 待這一切都做好了,我們還要在讓IIS知道,遇到圖片文件也要進(jìn)行處理。 這件事情我們還要讓IIS知道。而為什么aspx文件會被處理,而默認(rèn)的那些可以處理aspx的HttpHandler在哪里,其實(shí)是因?yàn)镮IS在接收到aspx頁面請求時(shí),會為其自動加載一個(gè)C:WINDOWSMicrosoft.NETFrameworkv1.1.4322aspnet_isapi.dll文件,這個(gè)文件是專為處理aspx頁面所用的,是。NET Framework的一部份,我們要IIS在接收到j(luò)pg文件請求時(shí)也為其加載這個(gè)dll文件。 我們首先添加一個(gè)處理,讀者可以參考aspx文件的配置就可以對處理jpg文件進(jìn)行配置,我們同樣也為jpg文件加載aspnet_isapi.dll文件,因?yàn)槲覀儗pg文件的處理也是建立在 ASP.NET機(jī)制之上的。具體配置,如下圖: OK,現(xiàn)在你已經(jīng)對此方法有一定的了解了,其實(shí)自定義HttpHandler還有其他的應(yīng)用,在此我們就不贅述了,下面的工作就需要讀者多多實(shí)踐了,并從中學(xué)習(xí)到更多的東西獲得更多的經(jīng)驗(yàn),更好地應(yīng)用設(shè)計(jì)開發(fā)的需求。來源華軍資訊編輯整理) |
|