小知识:

一个WEB的请求从客户端发到到服务端接收,处理并返回给客户端,它的流程是这样的(以aspx页面为例):

   HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()

inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET_ISAPI.DLL都寄存在此进程中。

  ASPNET_ISAPI.DLL:是处理.aspx文件的win32组件。其实IIS服务器是只能识别.html文件的,当IIS服务器发现被请求的文件是.aspx文件时,IIS服务器将其交给aspnet_isapi.dll来处理。

  aspnet_wp.exe进程:ASP.NET框架进程,提供.net运行的托管环境,.net的CLR(公共语言运行时)就是寄存在此进程中。

 1     // 摘要:
 2     //     定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
 3     public interface IHttpHandler
 4     {
 5         // 摘要:
 6         //     获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
 7         //
 8         // 返回结果:
 9         //     如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。
10         bool IsReusable { get; }
11
12         // 摘要:
13         //     通过实现 System.Web.IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
14         //
15         // 参数:
16         //   context:
17         //     System.Web.HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session
18         //     和 Server)的引用。
19         void ProcessRequest(HttpContext context);
20     }

ProcessRequest方法是我们要写的逻辑,它的参数是当前请求的上下文,例如,你要访问http://localhost:3333/home/index,它的context就是当前
Request的上下文,而如果我们在httphandler里针对一个扩展名进行策略,如jpg,gif,那么,当WEB去渲染这些文件这前,将会首先处理httphandler中的ProcessRequest方法,然后,如果不符合条件,你可以在页面上渲染你自己规定的信息,如果没有问题,再显示真实的图片!
这其实就是一个图片的防盗链技术,呵呵!效果如图:

而在页面上显示的图像路径还真实的:

这说明,httphandler是在处理这个物理文件之前,重新把另一个文件渲染上去了,呵呵
代码如下:
 1  /// <summary>
 2     /// 图片防盗链
 3     /// </summary>
 4     public class ImgHandler : IHttpHandler
 5     {
 6         const string errImg = "/Content/daolian.jpg";
 7         public void ProcessRequest(HttpContext context)
 8         {
 9             // 获取文件服务器端物理路径
10             string FileName = context.Server.MapPath(context.Request.FilePath);
11             // 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
12             if (context.Request.UrlReferrer == null || context.Request.UrlReferrer.Host == null)
13             {
14                 context.Response.ContentType = "image/JPEG";
15                 context.Response.WriteFile(errImg);
16             }
17             else
18             {
19                 if (context.Request.UrlReferrer.Host.IndexOf("eee114.com") > 0)
20                 {
21                     context.Response.ContentType = "image/JPEG";
22                     context.Response.WriteFile(FileName);
23                 }
24                 else
25                 {
26                     context.Response.ContentType = "image/JPEG";
27                     context.Response.WriteFile(errImg);
28                 }
29             }
30         }
31
32         public bool IsReusable
33         {
34             get { return true; }
35         }
36     }

在WWW网站的web.config中的<system.web>节点去调用它

   <!-- HttpHandlers对请求的扩展名进行处理 --><httpHandlers><add path="*.jpg,*.jpeg,*.gif,*.png,*.bmp" verb="*" type="HttpHandler.ImgHandler,HttpHandler" /></httpHandlers>

而流媒体的防盗链也是一样的方法,当然如果希望你的流媒体需要满足某种条件的用户才能看到的话,也可以这样去干:

 1   /// <summary>
 2     /// 流媒体防盗链
 3     /// </summary>
 4     public class VideoHandler : IHttpHandler
 5     {
 6         const string errVideo = "/Content/daolian.jpg";
 7         #region IHttpHandler 成员
 8
 9         public bool IsReusable
10         {
11             get { return true; }
12         }
13
14         public void ProcessRequest(HttpContext context)
15         {
16             //验证符合访问媒体的用户权限
17             if (context.Session == null
18                 || context.Session["UserID"] == null
19                 || Convert.ToInt32(context.Session["UserID"]) <= 0)
20             {
21                 context.Response.ContentType = "mpg4 video/mp4";
22                 context.Response.WriteFile(errVideo);
23             }
24         }
25
26         #endregion
27     }

web.config是它的入口,呵呵

   <!-- HttpHandlers对请求的扩展名进行处理 --><httpHandlers><add path="*.avi,*.mp4,*.3gp,*.flv" verb="*" type="HttpHandler.VideoHandler,HttpHandler" /></httpHandlers>

OK,这时,你的流媒体在访问和下载之前,也会进行验证,不满足,就会下载默认的了,呵呵!

看来在页面“请求之前”,发生的事确实不少呀!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:请求之前~HttpHandler实现媒体文件和图像文件的盗链,如需转载请自行联系原博主。

请求之前~HttpHandler实现媒体文件和图像文件的盗链相关推荐

  1. python referer伪造_php伪造Referer请求反盗链资源

    有些产品为了防止自己的产品被盗链访问,会采用反盗链措施,如封闭型生态的音乐网站和视频网站,他们已经为了版权付费,自然不希望你免费使用他们的资源.但因为很多人专门研究盗链,因此我们也需要了解下盗链.反盗 ...

  2. 文章抓取显示盗链 php,盗链是什么?php怎么伪造Referer请求反盗链资源(附示例)...

    本篇文章给大家带来的内容是关于盗链是什么?php怎么伪造Referer请求反盗链资源(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 有些产品为了防止自己的产品被盗链访问,会 ...

  3. wordpress添加html媒体文件,WordPress“添加媒体”文件时只显示上传到当前文章的附件图片...

    最近子凡把很大一部分精力都分散在了泪雪建站的改版和泪雪网的运营中去了,随着泪雪网的定位和内容的新增,网站也需要有很多细节的升级,而在今天就给大家分享一个 WordPress 如何在编辑文章时" ...

  4. 文件服务器 工作站 通信媒体,用于多工作站/多平台非线性视频编辑系统的媒体文件访问和存储解决方案...

    摘要: 一种新颖的系统,方法和计算机程序产品,用于通过与媒体存储装置通信的服务器装置访问存储在集中媒体存储装置中的数字媒体文件.该服务器通过网络连接与至少两个独立的工作站有效地耦合.该方法步骤包括:通 ...

  5. python上传钉钉媒体文件_钉钉媒体文件上传

    最近一个项目需要在钉钉中导出excel.钉钉的文件导出都是工作通知的形式导出.工作通知只能附带媒体文件(media,钉钉自定义的说法),所以采取的策略是先在服务端生成要导出的excel文件,在通过钉钉 ...

  6. 在生产中提供Django静态和媒体文件

    Serving static and media files directly from the Django server during production leaves room for ren ...

  7. Java 企业微信会话内容(聊天记录)存档功能实现,并获取媒体文件

    注:本文档是在Linux环境下进行测试的. 今天终于有空来聊聊企业微信"会话内容存档",虽然官方有给出开发文档,但确实是有点晦涩难懂啊,对于我这种菜鸟来说. 在网上翻阅许多教程,也 ...

  8. 媒体文件 服务器,媒体文件服务器系统

    媒体文件服务器系统 内容精选 换一换 当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的.CIFS类型的文件系统不支持使用Linux操作系统的云服务器进行挂 ...

  9. FFmpeg 与媒体文件关系

    1. 容器/文件(Container/File):即特定格式的多媒体文件,比如MP4,flv,mov等. 2. 媒体流(Stream):表示在时间轴上的一段连续的数据,比如一段声音数据.一段视频数据或 ...

最新文章

  1. shell最大出现和连续出现次数_从 1 到 n 整数中 1 出现的次数
  2. 深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子
  3. Caffe使用step by step:caffe框架下的基本操作和分析
  4. linux基础(6)-shell编程
  5. 【STM32】无线通信实验代码详解
  6. 基于Spring+SpringMVC+Mybatis的分布式敏捷开发系统架构(附源码)
  7. CSDN博客图片水印|自定义水印|去除水印
  8. Delphi编译指令了解学习
  9. SQL Server Reporting Services最佳做法
  10. Mysql复习(基础概念+基础操作)
  11. 昆特牌Online——客户端用到的一些技术
  12. (27)python-多维数组
  13. linxu的文件类型和扩展名
  14. 4412的linux启动原理,友坚科技三星4412开发板Linux平台下UT4412BV03裸机开发指南(十一)...
  15. FREETEXTBOX
  16. Hive面试题汇总大全
  17. masm32快速编辑器菜单翻译整理
  18. 【Qt】用setValue()设置UI控件内的内容,如何避免valuechange()被触发
  19. 笔记本设置WiFi热点命令操作
  20. 5款优秀的免费加密软件

热门文章

  1. Python 装饰器实例
  2. zip压缩工具与tar打包并压缩工具
  3. 静态路由的不通配置方式
  4. bzoj1724[Usaco2006 Nov]Fence Repair 切割木板*
  5. Java GC 原理
  6. 利用varnish构建httpd缓存服务器
  7. 《神探tcpdump第五招》-linux命令五分钟系列之三十九
  8. 第六课-Android四大组件之Activity
  9. 用一句位运算判断两个整数的大小并返回较大者
  10. 跟我一起学Oracle 11g【1】----基础回顾