首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下:

  1. //// <summary>
  2. /// 防盗链Filter.
  3. /// </summary>
  4. public class AntiOutSiteLinkAttribute : ActionFilterAttribute, IActionFilter
  5. {
  6. public AntiOutSiteLinkAttribute(FileType fileType)
  7. {
  8. this.FileType = fileType;
  9. }
  10.  
  11. //// <summary>
  12. /// 请求的文件类型.(文件或图片)
  13. /// </summary>
  14. public FileType FileType { get; set; }
  15.  
  16. #region IActionFilter 成员
  17.  
  18. void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
  19. {
  20. HttpContextBase httpContext = filterContext.HttpContext;
  21. if (null != httpContext.Request.UrlReferrer)
  22. {
  23. string serverDomain = httpContext.Request.Url.Host;
  24. string refDomain = httpContext.Request.UrlReferrer.Host;
  25. if (GetRootDomain(refDomain).Equals(GetRootDomain(serverDomain), StringComparison.OrdinalIgnoreCase))
  26. {
  27. return;//如果根域名相同就返回
  28. }
  29. }
  30.  
  31. ContentResult cr = new ContentResult();
  32. if (FileType == FileType.Image)
  33. {
  34. cr.ContentType = "image/jpeg";
  35. FileInfo fi = new FileInfo(httpContext.Server.MapPath("~/Content/images/outsitelink.jpg"));
  36. if (fi.Exists)
  37. {
  38. httpContext.Response.WriteFile(fi.FullName);
  39. }
  40. else
  41. {
  42. Bitmap bmp = new Bitmap(, );
  43. Graphics g = Graphics.FromImage(bmp);
  44. g.FillRectangle(Brushes.White, , , , );
  45. g.DrawString("请不要盗链", new Font("Arial", ), Brushes.Red, new PointF(, ));
  46. bmp.Save(httpContext.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
  47. }
  48. }
  49. else
  50. {
  51. cr.ContentType = "text/html";
  52. cr.Content = string.Format("请不要盗链。返回<a href='{0}'>{1}</a>", Utils.AbsoluteWebRoot, BlogSettings.Instance.Name);
  53. }
  54. //将当前的上下文的ActionResult设置为我们的cr(ContentResult)
  55. filterContext.Result = cr;
  56. }
  57. #endregion
  58.  
  59. //// <summary>
  60. /// 获取网站的根域名
  61. /// </summary>
  62. /// <param name="domain">网站的域名,不带"Http://"</param>
  63. /// <returns></returns>
  64. private string GetRootDomain(string domain)
  65. {
  66. if (string.IsNullOrEmpty(domain))
  67. {
  68. throw new ArgumentNullException("参数'domain'不能为空");
  69. }
  70. string[] arr = domain.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
  71. if (arr.Length <= )
  72. {
  73. return domain;
  74. }
  75. else
  76. {
  77. return arr[arr.Length - ] + "." + arr[arr.Length - ];
  78. }
  79. }
  80. }
  81.  
  82. public enum FileType
  83. {
  84. File = ,
  85. Image
  86. }

然后我们建立一个用于处理文件请求的Controller,并应用上我们刚才建立的Filter:

  1. public class FilesController : BaseController
  2. {
  3. [AntiOutSiteLink(FileType.Image)]
  4. public ActionResult Image(string file)
  5. {
  6. return Content("Image From 4mvc");
  7. }
  8.  
  9. [AntiOutSiteLink(FileType.File)]
  10. public ActionResult File(string file)
  11. {
  12. return Content("File From 4mvc");
  13. }
  14. }

测试结果:

对于ActionFilter的应用是很广泛的,需要灵活运用。对于其他应用,可以参考ASP.NET MVC Action Filter - 缓存与压缩 这一篇文章。

用Filter实现图片防盗链的更多相关文章

  1. CSS代码实现图片防盗链

    CSS代码实现图片防盗链的方法其实很简单.在CSS文件中添加以下代码: img { filter:exPRession( this.不能去掉 ? "" : ( (!this.com ...

  2. Django项目开发,XSS攻击,图片防盗链,图片验证码,kindeditor编辑器

    目录 一.Django项目开发 1. 项目开发流程 2. auth模块的补充 (1)django的admin可视化管理页面 (2)将admin可视化管理页面的模型表显示成中文 (3)auth模块的用户 ...

  3. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  4. ASP.NET 实现简单的图片防盗链介绍

    在此,网站图片防盗链的方法是,通过获取Http请求头中的 Referer 标头与本网站域名比较,来判断用户是否来自本站跳转过来的 . 创建一个全局处理程序,用来处理images目录下的图片的直接请求: ...

  5. Nginx修改配置实现图片防盗链

    一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...

  6. asp.net MVC 网站图片防盗链的几种方法

    目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...

  7. php解决微信文章图片防盗链

    解决微信文章图片防盗链 function actionWechatImg() { header('Content-type: image/jpg'); $url = $_GET['url']; $re ...

  8. Java破解图片防盗链

    前言 今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额.然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念.哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们 ...

  9. 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)

    一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

随机推荐

  1. 20181013xlVba计算优秀率及合格率

    Sub 计算高一优秀合格率() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim dOs As Object 'Out ...

  2. You Don't Know JS: this & Object Prototypes( 第2章 this)

    this is a binding made for each function invocation, based entirely on its call-site (how the functi ...

  3. mac 下配置Android sdk

    1.通过homebrew进行安装  地址:https://brew.sh/index_zh-cn.html 2.homebrew install android sdk 3.找到路径如: /Users ...

  4. dijkstra优化

    1, 桶优化最短路, 时间复杂度$O(m+n)$, 空间$O(C)$, $C$为最短路长度 const int N = 1e6+10; int n, m; struct _ {int to,w;}; ...

  5. Merge K Sorted List(含Merge Two Sorted LIst) leetcode java

    问题描述: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complex ...

  6. linux Boot目录满了之后的解决方法

    boot目录为什么会满? Linux默认分区时,boot分区就200多M,按理说也不小,足够了(实际也就几十M),但是内核经常性的升级,而且自己又不自动卸载,于是该目录下旧的内核文件越积越多,最后就满 ...

  7. ERROR: java.lang.NullPointerException的一种情况

    java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...

  8. 『MXNet』第八弹_数据处理API_下_Image IO专题

    想学习MXNet的同学建议看一看这位博主的博客,受益良多. 在本节中,我们将学习如何在MXNet中预处理和加载图像数据. 在MXNet中加载图像数据有4种方式. 使用 mx.image.imdecod ...

  9. 解决validaform先验证后 ajax提交

    $(".myfroms").Validform({//form class btnSubmit:".submitLayer", 绑定提交按钮 tiptype:4 ...

  10. 水题系列一:Circle

    问题描述:Circle 小明在玩游戏,他正在玩一个套圈圈的游戏.他手里有 L 种固定半径的圆圈,每一种圆 圈都有其固定的数量.他要把这些圆圈套进 N 个圆形槽中的一个.这些圆形槽都有一个最 小半径和最 ...