using System;
using System.Web;
/// <summary>
/// ImageProtect 的摘要说明
/// </summary>
public class ImageProtect : IHttpHandler
{
public ImageProtect()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void ProcessRequest(HttpContext context)
{
// 判断是否是本地引用,如果是则返回给客户端正确的图片,这里的判断就是用到了前面所述的http请求中所记路的参考页信息
// 此处使用了端口,仅用于
if (context.Request.UrlReferrer.Host == " localhost " && context.Request.UrlReferrer.Port == 6999 )
{
// 设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Expires = 0 ;
// 清空服务器端为此会话开辟的输出缓存
context.Response.Clear();
// 获得文件类型
context.Response.ContentType = " image/jpeg " ;
// 将请求文件写入到服务器端为此会话开辟的输出缓存中
context.Response.WriteFile(context.Request.PhysicalPath);
// 将服务器端为此会话开辟的输出缓存中的信息传送到客户端
context.Response.End();
}
else // 如果不是本地引用,则属于盗链引用,返回给客户端错误的图片
{
// 设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Expires = 0 ;
// 清空服务器端为此会话开辟的输出缓存
context.Response.Clear();
// 获得文件类型
context.Response.ContentType = " image/jpeg " ;
// 将特殊的报告错误的图片文件写入到服务器端为此会话开辟的输出缓存中
context.Response.WriteFile( " ~/images/error.jpg " );
// 将服务器端为此会话开辟的输出缓存中的信息传送到客户端
context.Response.End();
}
}
public bool IsReusable
{
get
{
return false ;
}
}
}
Web.Config
< httpHandlers >
< add verb = " * " path = " *.jpg " type = " ImageProtect " />
</ httpHandlers >
2 .
#region IHttpHandler 成员
bool IHttpHandler.IsReusable
{
get { return true ; }
}
void IHttpHandler.ProcessRequest(HttpContext context)
{
string FileName = context.Server.MapPath(context.Request.FilePath);
if (context.Request.UrlReferrer.Host == null )
{
context.Response.ContentType = " image/JPEG " ;
context.Response.WriteFile( " /no.jpg " );
}
else
{
if (context.Request.UrlReferrer.Host.IndexOf( " mydomain.com " ) > 0 )
{
context.Response.ContentType = " image/JPEG " ;
context.Response.WriteFile(FileName);
}
else
{
context.Response.ContentType = " image/JPEG " ;
context.Response.WriteFile( " no/jpg " );
}
}
}
#endregion
编译成dll。
< httpHandlers >
< add verb = " * " path = " *.jpg " type = " JpgHandler, MyDll " />
</ httpHandlers >
在IIS网站配置中把JPG映射到aspnet_isapi.dll