博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片防盗链
阅读量:7009 次
发布时间:2019-06-28

本文共 2098 字,大约阅读时间需要 6 分钟。

using
 System;
using
 System.Web;
///
 
<summary>
///
 ImageProtect 的摘要说明
///
 
</summary>
public
 
class
 ImageProtect : IHttpHandler
{
    
public
 ImageProtect()
    {
        
//
        
//
 TODO: 在此处添加构造函数逻辑
        
//
    }
    
public
 
void
 ProcessRequest(HttpContext context)
    {
        
//
判断是否是本地引用,如果是则返回给客户端正确的图片,这里的判断就是用到了前面所述的http请求中所记路的参考页信息
        
//
此处使用了端口,仅用于       
        
if
 (context.Request.UrlReferrer.Host 
==
 
"
localhost
"
&&
context.Request.UrlReferrer.Port
==
6999
)               
        {
            
//
设置客户端缓冲中文件过期时间为0,即立即过期。
            context.Response.Expires 
=
 
0
;                               
            
//
清空服务器端为此会话开辟的输出缓存
            context.Response.Clear();                                   
            
//
获得文件类型
            context.Response.ContentType 
=
 
"
image/jpeg
"
;                
            
//
将请求文件写入到服务器端为此会话开辟的输出缓存中
            context.Response.WriteFile(context.Request.PhysicalPath);   
            
//
将服务器端为此会话开辟的输出缓存中的信息传送到客户端
            context.Response.End();   
        }
        
else
     
//
如果不是本地引用,则属于盗链引用,返回给客户端错误的图片
        {
            
//
设置客户端缓冲中文件过期时间为0,即立即过期。
            context.Response.Expires 
=
 
0
;                               
            
//
清空服务器端为此会话开辟的输出缓存
            context.Response.Clear();                                   
            
//
获得文件类型
            context.Response.ContentType 
=
 
"
image/jpeg
"
;                
            
//
将特殊的报告错误的图片文件写入到服务器端为此会话开辟的输出缓存中
            context.Response.WriteFile(
"
~/images/error.jpg
"
);                    
            
//
将服务器端为此会话开辟的输出缓存中的信息传送到客户端
            context.Response.End();
        }
    }
    
public
 
bool
 IsReusable
    {
        
get
        {
            
return
 
false
;
        }
    }
}
 
Web.Config
<
httpHandlers
>
 
<
add verb
=
"
*
"
 path
=
"
*.jpg
"
 type
=
"
ImageProtect
"
/>
</
httpHandlers
>
 
2
.
#region
 IHttpHandler 成员
    
bool
 IHttpHandler.IsReusable
    {
        
get
 { 
return
 
true
; }
    }
    
void
 IHttpHandler.ProcessRequest(HttpContext context)
    {
        
string
 FileName 
=
 context.Server.MapPath(context.Request.FilePath);
        
if
 (context.Request.UrlReferrer.Host 
==
 
null
)
        {
            context.Response.ContentType 
=
 
"
image/JPEG
"
;
            context.Response.WriteFile(
"
/no.jpg
"
);
        }
        
else
        {
            
if
 (context.Request.UrlReferrer.Host.IndexOf(
"
mydomain.com
"
>
 
0
)
            {
                context.Response.ContentType 
=
 
"
image/JPEG
"
;
                context.Response.WriteFile(FileName);
            }
            
else
            {
                context.Response.ContentType 
=
 
"
image/JPEG
"
;
                context.Response.WriteFile(
"
no/jpg
"
);
            }
        }
    }
    
#endregion
编译成dll。
<
httpHandlers
>
<
add verb
=
"
*
"
 path
=
"
*.jpg
"
 type
=
"
JpgHandler, MyDll
"
 
/>
</
httpHandlers
>

在IIS网站配置中把JPG映射到aspnet_isapi.dll

    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/12/1565388.html,如需转载请自行联系原作者

你可能感兴趣的文章