• 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();
        }
  • 相关阅读:
    判断日期是否是法定节假日或者休息日
    linux版powershell安装教程(.net core版)
    两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
    powershell中使用超大内存对象
    powershell脚本,命令行参数传值,并绑定变量的例子
    在docker容器中安装和使用,linux版的powershell
    powershell开源新闻及简介
    用powershell+excel行列转置三步走
    让powershell同时只能运行一个脚本(进程互斥例子)
    powershell玩转SQL SERVER所有版本
  • 原文地址:https://www.cnblogs.com/javabin/p/1583005.html
Copyright © 2020-2023  润新知