Kummy's Blog

o(︶︿︶)o { name : 'Kummy' , job : 'Feser' }

图片防盗链实现

项目结构如下

代码一:

ImageCalss

namespace 防盗链.Handler
{
    public class ImageClass : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        //禁止盗链的图片
        const string errImg = "/Content/Images/daolian.jpg";
        public void ProcessRequest(HttpContext context)
        {
            //获取文件服务器物理地址
            string fileName = context.Server.MapPath(context.Request.FilePath);

            //如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
            if (context.Request.UrlReferrer == null || context.Request.Url.Host == null)
            {
                context.Response.ContentType = "image/JPEG";
                context.Response.WriteFile(context.Server.MapPath(errImg));
            }
            else
            {
                if (context.Request.UrlReferrer.Host.IndexOf("www.testdao.com") > -1)
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile(fileName);
                }
                else
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile(context.Server.MapPath(errImg));
                }
            }
        }
    }
}

代码二:在Web.config中的<system.web>节点下加上这句话,用来指定当请求/Content/Images/文件夹下面的图片的时候,去动态的执行“Verb”指定的另一个执行类去处理.

 <!-- HttpHandlers对请求的扩展名进行处理 -->
    <httpHandlers>
      <add  path="/Content/Images/*.jpg,*.jpeg,*.gif,*.png,*.bmp"  verb="*" type="防盗链.Handler.ImageClass,防盗链"/>
    </httpHandlers>

测试盗链效果如下 :

配置IIS,模拟一个上线发布的网站:如 ”http://www.testdao.com/Content/Images/tupian.jpg“, 能正常显示图片,因为是本网站。

如图:

如果不配置IIS,就相当于引入了”http://www.testdao.com“ 网站的图片,就会返回一个盗链图片的图片,

如图:

您的支持是我最大的动力,如果你觉得还可以,请您给个”推荐“!

posted @ 2013-02-27 14:02  李 维  阅读(751)  评论(1编辑  收藏  举报