这个东西的原理之类的就不讲呢咯,太笼统,做几个实例设断点走一遍再看看ASP.NET的运行机制图就了解呢咯.
新建一个一般处理文件Handler.ashx然后再里面写入
public
class
Handler : IHttpHandler
...
{
//这样写的好处可以动态控制防盗链的站点,避免换域名的时候要重新发布,里面还可以扩充,如果用户用二级域名了,就可以在WEB.CONFIG输入的时候用|来区分
//然后这里接受的时候取|写进数组,循环判断
public string domins = ConfigurationManager.AppSettings["url"].ToString();
public void ProcessRequest(HttpContext context)
...{
//判断是否是本地引用,如果是则返回给客户端正确的图片
//这里的判断就是用到了http请求中所记录的页信息
//如果是网站,可将“localhost”修改为网站地址
if (context.Request.Url.Host == domins)
...{
//设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Expires = 0;
//清空服务器端为此会话开辟的输出缓存
context.Response.Clear();
//获得文件类型 防盗链图片的类型-如有多个可以添加
context.Response.ContentType = "image/jpg";
//将请求文件写入到输出缓存中
context.Response.WriteFile(context.Request.PhysicalPath);
//将输出缓存中的信息传送到客户端
context.Response.End();
}
//如果不是本地引用,则属于盗链引用,返回给客户端错误的图片
else
...{
//设置客户端缓冲中文件过期时间为0,即立即过期。
context.Response.Expires = 0;
//清空服务器端为此会话开辟的输出缓存
context.Response.Clear();
//获得文件类型
context.Response.ContentType = "image/jpg";
//将特殊的报告错误的图片文件写入到输出缓存中
context.Response.WriteFile(context.Request.PhysicalApplicationPath + "images/image_error.jpg");
//将输出缓存中的信息传送到客户端
context.Response.End();
}
}
public bool IsReusable
...{
get
...{
return true;
}
}
}
然后在web.config文件下的
节点下填加
<
add verb
=
"
*
"
path
=
"
*.jpg
"
type
=
"
Handler
"
/>
这样一来一个图片防盗连的程序就做好了,原理是当用户比如在浏览器URL里输入http://laohekou.net/images/20077315391029510.jpg,就会先进入web.config里,
节点下,发现有一个处理文件是过滤.jpg文件的就会进入到Handler这个类型中去,就是Handler.ashx这个文件,然后就会执行里面的代码,当发现如果浏览器里的URL域名不是ConfigurationManager.AppSettings[
"
url
"
].ToString();里指定的就会显示image_error.jpg这个图片,而非是20077315391029510.jpg
这个图片,其中verb是指拦截的请求动作类型,比如可以写是GET,POST,而path是指引发这个事件的文件目录和文件类型,比如我如果写path="images/*.jpg",那么我引用非images文件夹的图片不会引起这个处理程序,或者我引用非.jpg的文件也不会引起处理程序
再举个例子感受下,比如现在我要做个资源下载的站点但是要做等级限制,那肯定不能允许用户通过http://laohekou.net/demo.rar这种方式下载,同以上的原理,我们要先做拦截然后再在程序里处理
新建一个处理程序HandlerFile.ashx,然后再其中写到如果进行http://laohekou.net/demo.rar这样的下载操作跳转到default.aspx 页面
public
class
HandlerFile : IHttpHandler
...
{
public void ProcessRequest(HttpContext context)
...{
//用户执行非法连接下载处理事件就是跳转到这个页面,可以执行其他操作
HttpResponse response = context.Response;
response.Redirect("~/Default.aspx");
}
public bool IsReusable
...{
get
...{
return true;
}
}
}
然后再到web.config文件下的
节点下填加
<
add verb
=
"
*
"
path
=
"
Soft/*.*
"
type
=
"
HandlerFile
"
/>
什么意思呢?就是说如果有请求到Soft文件夹下的操作,无论什么类型的文件都会进入HandlerFile处理程序中去,我们在程序中写所有过来的请求都给跳转到Default.aspx页面,这样做就防止下载了, 然后我们可以自己写下载的事件,如下:
public
void
DownLoads(
string
fileName)
...
{
Response.Clear(); //清空响应信息-避免每次的信息叠加
Response.Buffer = true; //打开缓冲-防止突然掉线之类失去下载连接
Response.Charset = "utf-8"; //指定编码形式-避免下载DOC之类的文件出现乱码
this.EnableViewState = false; //关闭视图状态-提高下载的性能
Response.ContentEncoding = System.Text.Encoding.UTF8; //同上
//指定现在的文件框名称-Server.UrlEncode防止出现中文乱码
Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", Server.UrlEncode(fileName)));
Response.ContentType = "application/unknown"; //指定输出类型
//Soft是一级目录的名称,如果要还目录存储切记要更改web.config里
path的路径要和这里一样
string filePath = string.Format("{0}Soft\\{1}", Request.PhysicalApplicationPath, fileName);
Response.WriteFile(filePath);
Response.Flush();
Response.Close();
Response.End();
}