防盗链IHttpHandler类[防盗链图片]

来源:互联网 发布:2017云计算发展趋势 编辑:程序博客网 时间:2024/04/28 06:30

今天在网上看到有一个人需要这样的,我也不知道什么时候我从哪学习到的代码,反正我用过在自己的项目中,居然有人说是失传的技术,晕倒!

相关链接:http://topic.csdn.net/u/20080522/12/94f55383-2890-41fb-a3fb-5cc891bda033.html


IHttpHandler 成员
//web.config里添加一下代码
<httpHandlers>
<add verb="*" path="*.jpg" type="JpgHandler, MyDll" />
</httpHandlers>


其实就像文章里说的:

(1)实现IHttpHandler接口
(2)在配置文件中(web.config)指明是由哪个类实现的这个接口,需要完整的命名空间等。

IIS处理顺序:
(1)加载web.config
(2)调用IHttpHandler的实现类。

那个代码写在哪里都行,关键是在于web.config配置文件里面如何设置。
code=XML]  <httpHandlers>
       <add verb="*" path="*.jpg" type="myhandler,App_Code"/>
     </httpHandlers>[[/code]
上面这段配置代码才是关键中的关键。

详细的类文件如下代码:

 

/***************************************************** 
* 防盗链IHttpHandler 


* 增加了对文件关键字的选择(即仅对文件名存在某些关键字或不存在某些关键字进行过滤) 
* 设置web.config中<appSettings>节以下值 
* string eWebapp_NoLink 如果文件名符合该正确表态式将进行过滤(不设置对所有进行过滤) 
* string eWebapp_AllowLink 如果文件名符合该正确表态式将不进行过滤(优先权高于AllowLink,不设置则服从AllowLink) 
* bool eWebapp_ AllowOnlyFile 如果为False,(默认true)则不允许用户直接对该文件进行访问建议为true 


* 以下设置均可省略,设置只是为了增加灵活性与体验 
* eWebapp_NoLink_Message 错误信息提示:默认为Link From:域名 
* eWebapp_Error_Width 错误信息提示图片宽 
* eWebapp_Error_Height 错误信息提示图片高 


****************************************************
*/
 

using System; 
using System.Web; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Configuration; 
using System.Text.RegularExpressions; 

namespace eWebapp 

/// <summary> 
/// 防盗链IHttpHandler 
/// 参考http://www.softat.org/archiver/tid-52114.html 
/// 垃圾猪 2005-9-12 修正 
/// </summary> 

public class NoLink : IHttpHandler 

private string eWebapp_NoLink = string.Empty; 
private string eWebapp_AllowLink = string.Empty; 
private bool eWebapp_AllowOnlyFile = true

private string eWebapp_NoLink_Message = string.Empty; 
private bool error = false

public NoLink() 

// 
// TODO: 在此处添加构造函数逻辑 
// 
}
 

public void ProcessRequest(HttpContext context) 

eWebapp_NoLink_Message 
= ConfigurationSettings.AppSettings["eWebapp_NoLink_Message"]; 

string myDomain = string.Empty; 

error 
= errorLink(context, out myDomain); 

if (Empty(eWebapp_NoLink_Message)) 

eWebapp_NoLink_Message 
= "Link from :" + myDomain; 
}
 

if (error) 

//Jpg(context.Response,eWebapp_NoLink_Message); 
Jpg(context.Response, eWebapp_NoLink_Message); 
}
 
else 

Real(context.Response, context.Request); 
}
 

}
 

public bool IsReusable 

get 

return true
}
 
}
 

/// <summary> 
/// 输出错误信息 
/// </summary> 
/// <param name="Response"></param> 
/// <param name="_word"></param> 

private void Jpg(HttpResponse Response, string _word) 


int myErrorWidth = _word.Length * 15
int myErrorHeight = 16
try 

int _myErrorWidth = Convert.ToInt32(ConfigurationSettings.AppSettings["eWebapp_Error_Width"]); 
if (_myErrorWidth > 0

myErrorWidth 
= _myErrorWidth; 
}
 

}
 
catch 


}
 
try 

int _myErrorHeight = Convert.ToInt32(ConfigurationSettings.AppSettings["eWebapp_Error_Height"]); 
if (_myErrorHeight > 0

myErrorHeight 
= _myErrorHeight; 
}
 
}
 
catch 


}
 
Bitmap Img 
= null
Graphics g 
= null
MemoryStream ms 
= null
Img 
= new Bitmap(myErrorWidth, myErrorHeight); 
= Graphics.FromImage(Img); 
g.Clear(Color.White); 
Font f 
= new Font("Arial"9); 
SolidBrush s 
= new SolidBrush(Color.Red); 
g.DrawString(_word, f, s, 
33); 
ms 
= new MemoryStream(); 
Img.Save(ms, ImageFormat.Jpeg); 
Response.ClearContent(); 
Response.ContentType 
= "image/Gif"
Response.BinaryWrite(ms.ToArray()); 
g.Dispose(); 
Img.Dispose(); 
Response.End(); 
}
 

/// <summary> 
/// 输出真实文件 
/// </summary> 
/// <param name="response"></param> 
/// <param name="context"></param> 

private void Real(HttpResponse response, HttpRequest request) 

FileInfo file 
= new System.IO.FileInfo(request.PhysicalPath); 

response.Clear(); 

response.AddHeader(
"Content-Disposition""filename=" + file.Name); 

response.AddHeader(
"Content-Length", file.Length.ToString()); 

string fileExtension = file.Extension.ToLower(); 

//这里选择输出的文件格式 
//可以参考http://ewebapp.cnblogs.com/articles/234756.html增加对更多文件格式的支持. 

switch (fileExtension) 


case "mp3"
response.ContentType 
= "audio/mpeg3"
break

case "mpeg"

response.ContentType 
= "video/mpeg"
break

case "jpg"

response.ContentType 
= "image/jpeg"
break

case "bmp"

response.ContentType 
= "image/bmp"
break

case "gif"

response.ContentType 
= "image/gif"
break

case "doc"

response.ContentType 
= "application/msword"

break
case "css"

response.ContentType 
= "text/css"
break

default

response.ContentType 
= "application/octet-stream"
break

}
 

response.WriteFile(file.FullName); 

response.End(); 
}
 

/// <summary> 
/// 确认字符串是否为空 
/// </summary> 
/// <param name="_value"></param> 
/// <returns></returns> 

private bool Empty(string _value) 

if (_value == null | _value == string.Empty | _value == ""

return true
}
 
else 

return false
}
 
}
 

/// <summary> 
/// 检查是否是非法链接 
/// </summary> 
/// <param name="context"></param> 
/// <param name="_myDomain"></param> 
/// <returns></returns> 

private bool errorLink(HttpContext context, out string _myDomain) 

HttpResponse response 
= context.Response; 
string myDomain = context.Request.ServerVariables["SERVER_NAME"]; 
_myDomain 
= myDomain; 
string myDomainIp = context.Request.UserHostAddress; 

eWebapp_NoLink 
= ConfigurationSettings.AppSettings["eWebapp_NoLink"]; 
eWebapp_AllowLink 
= ConfigurationSettings.AppSettings["eWebapp_AllowLink"]; 

try 

eWebapp_AllowOnlyFile 
= Convert.ToBoolean(ConfigurationSettings.AppSettings["eWebapp_AllowOnlyFile"]); 
}
 
catch 

eWebapp_AllowOnlyFile 
= true
}
 

if (context.Request.UrlReferrer != null


//判定referDomain是否存在网站的IP或域名 
string referDomain = context.Request.UrlReferrer.AbsoluteUri.Replace(context.Request.UrlReferrer.AbsolutePath, ""); 
string myPath = context.Request.RawUrl; 

if (referDomain.IndexOf(myDomainIp) >= 0 | referDomain.IndexOf(myDomain) >= 0

return false
}
 
else 

//这里使用正则表达对规则进行匹配 
try 

Regex myRegex; 

//检查允许匹配 
if (!Empty(eWebapp_AllowLink)) 


myRegex 
= new Regex(eWebapp_AllowLink); 

if (myRegex.IsMatch(myPath)) 

return false
}
 

}
 

//检查禁止匹配 
if (!Empty(eWebapp_NoLink)) 


myRegex 
= new Regex(eWebapp_NoLink); 
if (myRegex.IsMatch(myPath)) 

return true
}
 
else 

return false
}
 

}
 

return true

}
 
catch 

//如果匹配出错,链接错误 
return true
}
 
}
 
}
 
else 

//是否允许直接访问文件 
if (eWebapp_AllowOnlyFile) 

return false
}
 
else 

return true
}
 
}
 

}
 

}
 

}
 
代码都贴出来了,大家应该知道怎么样用了!