ihttphandler

这个东西的原理之类的就不讲呢咯,太笼统,做几个实例设断点走一遍再看看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();
    }

转载于:https://www.cnblogs.com/javabin/archive/2009/10/14/1583005.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值