用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 ...
随机推荐
- p1457 The Castle
原图找最大的房间及房间数很容易.然后从左下到右上找拆的位置.拆掉再bfs一次找面积. #include <iostream> #include <cstdio> #includ ...
- canvas手机端绘图解决方案
解决方案js:https://pan.baidu.com/s/1jIys2aU 我们使用canvas通常会遇到一个问题就是坐标系的问题,如果按象限来说,一般canvas是在第四象限,但是我们通常都喜欢 ...
- 暂时关闭 windows 病毒防护
- 线性、逻辑回归的java实现
线性回归和逻辑回归的实现大体一致,将其抽象出一个抽象类Regression,包含整体流程,其中有三个抽象函数,将在线性回归和逻辑回归中重写. 将样本设为Sample类,其中采用数组作为特征的存储形式. ...
- Leetcode 116
/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNod ...
- Linux登录超时自动退出处理办法
出于安全方面的考虑,机器常要求配置一个登录时间期限,当闲置超过这一期限就自动退出:但在某些场合我们需要时不时地就使用机器,如果每次都要重新ssh登录那是非常麻烦的 方法一:让当前会话一直处于工作状态 ...
- Java类型中ParameterizedType,GenericArrayType,TypeVariabl,WildcardType详解
(1). 和反射+泛型有关的接口类型 java.lang.reflect.Type:java语言中所有类型的公共父接口 java.lang.reflect.ParameterizedType java ...
- python图片识别
python 图像处理模块1. 安装 pytesseract模块是会自动安装Pillow模块.pillow 为标准图像处理库 手册地址 http://pillow-cn.readthedocs.io/ ...
- az nginx install and other
Nginx 1◆ nginx install 源码:https://trac.nginx.org/nginx/browser 官网:http://www.nginx.org/ ...
- php删除文件夹下面所有文件包括(删除文件夹)不删除文件夹
function deldir($dir) { //先删除目录下的文件: $dh=opendir($dir); while ($file=readdir($dh)) { if($file!=" ...