`

ASP.NET运行机制和图片盗链问题

阅读更多

ASP.NET运行机制

1 Http请求

如上图,我们先来真正了解一下什么是http请求,举一个简单的例子,你在浏览的一张网页上点击其中的一个超级链接”Microsoft程序员测试题”,如果这个链接到的地址是 http://www.frontfree.net/view/article_840.html ,那么浏览器会立刻向www.frontfree.net 这个服务器发送一条http请求.但是这个请求中不仅包括 http://www.frontfree.net/view/article_840.html字符串,而且还包括 这个www.frontfree.net/article字符串,这个信息是你的超级链接的参考页地址,或参考页信息,这个信息其实很重要,这个可以用在我们后文中所述的对图片盗链的判断中。当然这也是在http2.0规范中被要求的,其次还有一些其它信息,比如你请求的主机名,经过的路由器,客户端的一些信息等等,所以一个http请求中包括相当多的信息,并不像我们从表面上想到的那样简单.好了,现在我们已经知道了什么是http请求.接下来就是时候讲到ASP.NET的网络应用程序的运行机制了。

2 ASP.NET运行原理概述

如上图,当一个http请求发送过来并被IIS机收到之后,IIS首先通过你请求的页面类型为其加载相应的dll文件,然后在处理过程中将这条请求发送给能够处理这条请求的模块,而在ASP.NET中这个模块就叫做HttpHandler,为什么aspx这样的文件可以被服务器处理,那是因为在服务器端有默认的HttpHandler专门处理aspx文件,IIS再将这条请求发送给能够处理这条请求的模块之前,还需要经过一些HttpModule,这些都是系统默认的Modules,而且在这个http请求传到HttpHandler之前要经过不同的HttpModuls的处理,这就像我们如果要乘坐国际航班飞抵异国他乡的话,在你真正坐上飞机前,要经过购买机场建设费,办理登记手续核实身份,进行行李打包托运,进行安全检察,现在又要进行体温等检察一样,需要经一系列的严格的手续。这样做有什么好处,一是为一些必须的过程,二是为了安全性,三是为了提高效率,四是为了我们能够在更多的环节上进行控制,即增强了我们的控制能力。而上述的都是系统的,怎么能说是我们的对http请求控制能力能,那么我们是否可以建立自己的HttpModule和HttpHandler吗?答案是肯定的。但我们先不要急于做事,让我们再深入研究一下运行机制吧。

3 ASP.NET运行机制

那么上面这张图让我们能够更清楚地看到一个http请求是如何经过服务器的处理的,同时通过这张图我们也可以看出Request是掌管着所有客户端输入的。图中为我们展示了一个http请求有可能经过的四条路线。当你第一次访问这个页面时这个请求首先依次经过HttpModuls和HttpHandler的处理,而在HttpHandler的处理中服务器会为你转到你真正要访问的页面,然后通过ASP Engine来找到这个页面背后的类,并实例化为一个临时对象,再此过程中会触发一系列的事件,其中一部份的事件需要经过对象中的方法处理,之后服务器会将这个处理后页面发移交给Response对象,然后由Response对象将这个页面发送到客户端。这就是第一条路线,而当你在这个页面上进行重新提交一些信息,并继续向服务器发送请求时,因为你的服务器之间的会话已经建立,对于你所在的那个临时对象在服务器中已经建立,所以不用再经过初始化页面的工作,故这第二条路线是按照 HttpModuls,HttpHandler,然后直接与临时对象交互,然后返回的。第三条路线与第二条不同的是在处理请求时如果涉及到需要调用ASP Cache,既ASP 缓存的,而临时对象回将直接从ASP 缓存提取信息并返回.这第四条路线就是当你刷新这个页面的时候,服务器接收到时发现这个请求先前已经处理过了,并将处理结果存储到由一个默认的HttpModule管理的输出缓存中了,那么我们就可以直接从这个缓存提取信息并返回,而无需再重新处理一遍了。

图片盗链问题

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还有其他的应用,在此我们就不赘述了,下面的工作就需要读者多多实践了,并从中学习到更多的东西获得更多的经验,更好地应用设计开发的需求。

此文转载自opent.cn:http://www.opent.cn/a/099/1969.shtml

分享到:
评论

相关推荐

    ASP.NET-[影音娱乐]穷小子asp.net音乐盗链程序.zip

    10. **错误处理**:良好的错误处理机制是任何程序不可或缺的一部分,ASP.NET提供了异常处理结构,帮助开发者捕获和处理可能出现的错误。 总结来说,尽管这个案例中的应用涉及到不道德的用途,但它依然能让我们了解...

    ASP.NET-[图片动画]强少爷多功能图片随机显示程序(水印版)v1.0.zip

    ASP.NET的核心特性包括自动页面生命周期管理、内置的安全性、状态管理和缓存机制等。 2. **图片动画**:在Web开发中,图片动画通常涉及JavaScript、CSS3或者HTML5的SVG等技术。在这个程序中,可能是通过编程方式...

    ASP.NET源码——[上传下载]达达电子书下载系统(生成shtml)版.zip

    该系统可能需要IIS(Internet Information Services)作为Web服务器,并且需要安装相应的.NET Framework版本以支持ASP.NET运行。同时,服务器配置、数据库连接、错误日志记录等都是部署时需要考虑的因素。 总的来说...

    ASP.NET3.5典型模块开发源代码

    12.2.3 ASP.NET 3.5的运行机制 142 12.3 ASP.NET 3.5中防盗链的解决方案 142 12.3.1 设计处理图片的HttpHandler处理程序 143 12.3.2 在应用配置中注册HttpHandler 144 12.3.3 在IIS中配置图片的特殊处理...

    ASP.NET源码——[影音娱乐]吧酷影视点播系统 v3.0.2_barcoolvod20071207_new_59.zip

    4. **用户身份验证与授权**:为了管理用户访问权限,系统可能实现了ASP.NET的身份验证和授权机制,如Forms Authentication,控制用户登录和访问特定资源。 5. **视频流媒体**:点播系统通常涉及到视频流媒体技术,...

    asp.net HttpHandler实现图片防盗链

    这样,ASP.NET运行时就可以找到并加载这个自定义处理器。 最后,在`Web.config`文件的`&lt;httpHandlers&gt;`节中注册我们的HttpHandler。这里,我们指定了处理所有`.jpg`文件的请求,设置HTTP动词为`*`(意味着所有HTTP...

    net套餐部分视频

    视频中介绍的项目是基于ASP.NET MVC 3.0和EF4.1(Entity Framework)开发的CRM系统,其中利用了MVC3的Chart组件来实现图表统计,提供直观的数据分析界面,帮助管理层更好地理解客户行为和业务表现。 总的来说,这些...

    WBAL防盗链工具

    ASP.Net框架包括许多内置功能,如页面生命周期管理、状态管理、安全性和缓存机制,这些都使得开发高效、安全的Web应用变得更为便捷。 WBAL防盗链工具的运作原理可能涉及到以下几个关键技术点: 1. **URL检查**:...

    WBAL防盗链工具 v0.1

    总的来说,"WBAL防盗链工具 v0.1"是一个基于ASP.NET的解决方案,用于保护网站内容免受非法盗链。使用它需要一定的服务器管理和.NET编程知识,但提供了源码意味着有高级需求的用户可以对工具进行定制,以满足特定的...

    Asp.Net二级域名共享Forms身份验证、下载站/图片站的授权访问控制

    在进行***二级域名共享以及文件下载站的授权访问控制时,涉及到的技术要点和步骤非常丰富,主要包括了二级域名的设置、权限控制、Forms身份验证...同时,对于性能的持续监控和优化也是整个系统能够良好运行的重要保障。

    windowsXP下的iis发布

    - IIS 5.0:Windows 2000(支持ASP.NET 1.0/1.1/2.0) - IIS 6.0:Windows Server 2003, Windows XP Professional x64 Editions - IIS 7.0:Windows Vista, Windows Server 2008 ### IIS性能与限制 IIS的并发连接...

Global site tag (gtag.js) - Google Analytics