今天我们学习使用HttpModule和HttpHandler对象防盗链
首先,我们要了解HttpModele和HttpHandler对象是什么?
- HttpModule是HTTP请求的“必经之路”,它可以在该HTTP请求传递到最终的“请求处理中心(HttpHandler)”进行处理之前做一些额外工作,或者在某些情况下终止满足一些条件的HTTP请求,从而起到一个过滤的作用。
- HttpModele有多个,每次HTTP请求都将逐一通过每个HttpModele。HttpModele和HttpApplication对象是直接交互的。
我们画图来直观展示:
一、HttpHandler对象实现防盗链
概述:一些不良网站为了在不增加成本的前提下扩充自己站点的内容,经常盗用其他网站的资源,这种现象被称为盗链。 盗链有哪些危害?
1.损害了原网站的合法利益
2.加重了服务器的重担
防盗链演示与防盗链操作
具体要求:
第一步:创建一个网站,网站下的images文件夹中有jpg图片资源,本网站的页面引用图片的相对路径后正常使用。
第二步:创建第二个网站
(1)创建被盗链站点,相关代码如下:
<div>
<asp:Image ID="Image1" runat="server" ImageUrl="images/one.jpg"/>
<asp:Image ID="Image2" runat="server" ImageUrl="images/two.jpg" />
<asp:Image ID="Image3" runat="server" ImageUrl="images/three.jpg"/>
</div>
(2)创建盗链站点,代码如下:
<div>
<asp:Image ID="Image1" runat="server" ImageUrl="http://localhost:49222/images/one.jpg"/>
<asp:Image ID="Image2" runat="server" ImageUrl="http://localhost:49222/images/two.jpg" />
<asp:Image ID="Image3" runat="server" ImageUrl="http://localhost:49222/images/three.jpg"/>
</div>
(3)防盗链操作
1>添加一个Class1类
//获取上次请求的URL
Uri lastUrl = context.Request.UrlReferrer;
//获取本次请求的URL
Uri currentUrl = context.Request.Url;
//判断是否为盗链
if (lastUrl.Host != currentUrl.Host || lastUrl.Port != currentUrl.Port)
{
//获取“请勿盗链”警告提示图片路径
string errolImagePath = context.Request.PhysicalApplicationPath +"sa/four.jpg";
//发送客户端
context.Response.WriteFile(errolImagePath);
}
else
{
context.Response.WriteFile(context.Request.PhysicalPath);
}
盗链的判断依据:上次请求的主题和端口与本次请求的主题和端口是否一致,若不一致,则为盗链。
2>配置相关配置文件:
<system.webServer>
<handlers>
<add verb="*" path="images/*" type="test.Class1" name="sd"/>
</handlers>
</system.webServer>
注意:当浏览者访问一个页面时,页面的内容并非一次全部传送到客户端。如果请求的页面有许多图片或其他信息,那么最先响应的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中有图片,那么客户端浏览器会再发送一条HTTP请求,当这个请求被处理后,该图片文件会被传送到客户端,浏览器会将图片插入到页面的正确位置,所以客户端可能要发送多条HTTP请求以后,才能够看到完整的页面。基于这样的机制,会产生盗链问题。