用Filter实现图片防盗链
首先继承自FilterAttribute类同时实现IActionFilter接口,代码如下:
- //// <summary>
- /// 防盗链Filter.
- /// </summary>
- public class AntiOutSiteLinkAttribute : ActionFilterAttribute, IActionFilter
- {
- public AntiOutSiteLinkAttribute(FileType fileType)
- {
- this.FileType = fileType;
- }
- //// <summary>
- /// 请求的文件类型.(文件或图片)
- /// </summary>
- public FileType FileType { get; set; }
- #region IActionFilter 成员
- void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
- {
- HttpContextBase httpContext = filterContext.HttpContext;
- if (null != httpContext.Request.UrlReferrer)
- {
- string serverDomain = httpContext.Request.Url.Host;
- string refDomain = httpContext.Request.UrlReferrer.Host;
- if (GetRootDomain(refDomain).Equals(GetRootDomain(serverDomain), StringComparison.OrdinalIgnoreCase))
- {
- return;//如果根域名相同就返回
- }
- }
- ContentResult cr = new ContentResult();
- if (FileType == FileType.Image)
- {
- cr.ContentType = "image/jpeg";
- FileInfo fi = new FileInfo(httpContext.Server.MapPath("~/Content/images/outsitelink.jpg"));
- if (fi.Exists)
- {
- httpContext.Response.WriteFile(fi.FullName);
- }
- else
- {
- Bitmap bmp = new Bitmap(, );
- Graphics g = Graphics.FromImage(bmp);
- g.FillRectangle(Brushes.White, , , , );
- g.DrawString("请不要盗链", new Font("Arial", ), Brushes.Red, new PointF(, ));
- bmp.Save(httpContext.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
- }
- }
- else
- {
- cr.ContentType = "text/html";
- cr.Content = string.Format("请不要盗链。返回<a href='{0}'>{1}</a>", Utils.AbsoluteWebRoot, BlogSettings.Instance.Name);
- }
- //将当前的上下文的ActionResult设置为我们的cr(ContentResult)
- filterContext.Result = cr;
- }
- #endregion
- //// <summary>
- /// 获取网站的根域名
- /// </summary>
- /// <param name="domain">网站的域名,不带"Http://"</param>
- /// <returns></returns>
- private string GetRootDomain(string domain)
- {
- if (string.IsNullOrEmpty(domain))
- {
- throw new ArgumentNullException("参数'domain'不能为空");
- }
- string[] arr = domain.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
- if (arr.Length <= )
- {
- return domain;
- }
- else
- {
- return arr[arr.Length - ] + "." + arr[arr.Length - ];
- }
- }
- }
- public enum FileType
- {
- File = ,
- Image
- }
然后我们建立一个用于处理文件请求的Controller,并应用上我们刚才建立的Filter:
- public class FilesController : BaseController
- {
- [AntiOutSiteLink(FileType.Image)]
- public ActionResult Image(string file)
- {
- return Content("Image From 4mvc");
- }
- [AntiOutSiteLink(FileType.File)]
- public ActionResult File(string file)
- {
- return Content("File From 4mvc");
- }
- }
测试结果:
对于ActionFilter的应用是很广泛的,需要灵活运用。对于其他应用,可以参考ASP.NET MVC Action Filter - 缓存与压缩 这一篇文章。
用Filter实现图片防盗链的更多相关文章
- CSS代码实现图片防盗链
CSS代码实现图片防盗链的方法其实很简单.在CSS文件中添加以下代码: img { filter:exPRession( this.不能去掉 ? "" : ( (!this.com ...
- Django项目开发,XSS攻击,图片防盗链,图片验证码,kindeditor编辑器
目录 一.Django项目开发 1. 项目开发流程 2. auth模块的补充 (1)django的admin可视化管理页面 (2)将admin可视化管理页面的模型表显示成中文 (3)auth模块的用户 ...
- Nginx中防盗链(下载防盗链和图片防盗链)操作记录
日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...
- ASP.NET 实现简单的图片防盗链介绍
在此,网站图片防盗链的方法是,通过获取Http请求头中的 Referer 标头与本网站域名比较,来判断用户是否来自本站跳转过来的 . 创建一个全局处理程序,用来处理images目录下的图片的直接请求: ...
- Nginx修改配置实现图片防盗链
一般情况下,防盗链是针对软件下载和图片的,由于一般的站点不提供资源下载,所以本文主要是针对图片的防盗链 1.如果对全站图片做防盗链,至少需要一个另外的域名存放指向图片.因为如果对全站图片做了防盗链,包 ...
- asp.net MVC 网站图片防盗链的几种方法
目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...
- php解决微信文章图片防盗链
解决微信文章图片防盗链 function actionWechatImg() { header('Content-type: image/jpg'); $url = $_GET['url']; $re ...
- Java破解图片防盗链
前言 今天想下载几张好看的壁纸,然后发现了一张是自己比较喜欢的额.然后点进去看看,WOW!好多好看的壁纸呀,于是我就起了贪念.哈哈!想把他们这一组图片打包下载,小白的方法就是一张一张下载,那样对于我们 ...
- 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)
一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...
随机推荐
- 20181013xlVba计算优秀率及合格率
Sub 计算高一优秀合格率() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim dOs As Object 'Out ...
- 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 ...
- mac 下配置Android sdk
1.通过homebrew进行安装 地址:https://brew.sh/index_zh-cn.html 2.homebrew install android sdk 3.找到路径如: /Users ...
- dijkstra优化
1, 桶优化最短路, 时间复杂度$O(m+n)$, 空间$O(C)$, $C$为最短路长度 const int N = 1e6+10; int n, m; struct _ {int to,w;}; ...
- 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 ...
- linux Boot目录满了之后的解决方法
boot目录为什么会满? Linux默认分区时,boot分区就200多M,按理说也不小,足够了(实际也就几十M),但是内核经常性的升级,而且自己又不自动卸载,于是该目录下旧的内核文件越积越多,最后就满 ...
- ERROR: java.lang.NullPointerException的一种情况
java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...
- 『MXNet』第八弹_数据处理API_下_Image IO专题
想学习MXNet的同学建议看一看这位博主的博客,受益良多. 在本节中,我们将学习如何在MXNet中预处理和加载图像数据. 在MXNet中加载图像数据有4种方式. 使用 mx.image.imdecod ...
- 解决validaform先验证后 ajax提交
$(".myfroms").Validform({//form class btnSubmit:".submitLayer", 绑定提交按钮 tiptype:4 ...
- 水题系列一:Circle
问题描述:Circle 小明在玩游戏,他正在玩一个套圈圈的游戏.他手里有 L 种固定半径的圆圈,每一种圆 圈都有其固定的数量.他要把这些圆圈套进 N 个圆形槽中的一个.这些圆形槽都有一个最 小半径和最 ...