利用Http Handler实现防止盗链
2009-06-20 22:41
330 查看
这2天在看asp.net运行原理
ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?
为了搞清楚这个问题,我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。
可以看到,在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理,对于.aspx来说,是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说,是由System.Web.HttpForbiddenHandler 处理.
如果我们要用编程的方式来操控一个Http请求,我们就需要实现IHttpHandler接口,来定制我们自己的需求。
IHttpHandler要求实现一个方法和一个属性
下面就是利用实现IHttpHandler来完成防止盗链.
Code
public class JpgHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// 获取文件服务器端物理路径
string FileName = context.Server.MapPath(context.Request.FilePath);
// 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
if (context.Request.UrlReferrer.Host == null)
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile("~/error.jpg");
}
else
{
// 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片
if (context.Request.UrlReferrer.Host.IndexOf("localhost") > -1)
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile(FileName);
}
else
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile("~/error.jpg");
}
}
}
public bool IsReusable
{
get { return true; }
}
}
接着还需要配置webconfig
<httpHandlers>
<add verb="*" path="*.jpg" type="WebApplication9.JpgHandler,WebApplication9"/>
path指的是请求的文件名称,可以使用通配符扩大范围,也可以明确指定这个handler仅用于处理某个特定的文件(比如说:filename.aspx)的请求。verb指的是请求此文件的方式,可以是post或get,用*代表所有访问方式。type属性由“,”分隔成两部分,第一部分是实现了接口的类名,第二部分是位于Bin目录下的编译过的程序集名称。
最后还需要去IIS配置jpg的映射,之后就完成了.
ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?
为了搞清楚这个问题,我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。
可以看到,在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理,对于.aspx来说,是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说,是由System.Web.HttpForbiddenHandler 处理.
如果我们要用编程的方式来操控一个Http请求,我们就需要实现IHttpHandler接口,来定制我们自己的需求。
IHttpHandler要求实现一个方法和一个属性
下面就是利用实现IHttpHandler来完成防止盗链.
Code
public class JpgHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// 获取文件服务器端物理路径
string FileName = context.Server.MapPath(context.Request.FilePath);
// 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
if (context.Request.UrlReferrer.Host == null)
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile("~/error.jpg");
}
else
{
// 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片
if (context.Request.UrlReferrer.Host.IndexOf("localhost") > -1)
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile(FileName);
}
else
{
context.Response.ContentType = "image/JPEG";
context.Response.WriteFile("~/error.jpg");
}
}
}
public bool IsReusable
{
get { return true; }
}
}
接着还需要配置webconfig
<httpHandlers>
<add verb="*" path="*.jpg" type="WebApplication9.JpgHandler,WebApplication9"/>
path指的是请求的文件名称,可以使用通配符扩大范围,也可以明确指定这个handler仅用于处理某个特定的文件(比如说:filename.aspx)的请求。verb指的是请求此文件的方式,可以是post或get,用*代表所有访问方式。type属性由“,”分隔成两部分,第一部分是实现了接口的类名,第二部分是位于Bin目录下的编译过的程序集名称。
最后还需要去IIS配置jpg的映射,之后就完成了.
相关文章推荐
- 使用HttpHandler 实现无页面退出和防止盗链
- 利用MVC实现自定义RouteHandler来防止图片盗链
- Http Handler 介绍&防止图片盗链
- ASP.NET利用HttpHandler实现多扩展名文件下载
- ASP.NET利用HttpHandler实现多扩展名文件下载 [转]
- 转:ASP.NET 2.0利用Httphandler实现URL重写(伪URL及伪静态)
- Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
- 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)
- HttpHandler应用之 - 防止图片盗链
- ASP.NET2.0利用httphandler实现URL重写(伪URL及伪静态)
- ASP.NET2.0利用httphandler实现URL重写(伪URL及伪静态)
- 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链
- 转:ASP.NET 2.0利用Httphandler实现URL重写(伪URL及伪静态)
- (转)(转)【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链
- ASP.NET利用HttpHandler实现多扩展名文件下载
- HttpHandler应用之 防止图片盗链
- 利用Httphandler实现URL重写(重写URL及伪静态)
- ASP.NET2.0利用httphandler实现URL重写(伪URL及伪静态)
- Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
- Asp.net MVC 利用自定义RouteHandler来防止图片盗链