原理解释
网上现在比较流行的是使用handler来实现防盗链。具体的意思如下:专门新建一个针对某种文件请求的处理类(继承于IHttpHandler)并在web.config里面配置好所有的该文件请求都指向该类。然后在类里面判断该请求的前一次请求是不是存在并且指向我们站的域名,如果存在则认为不是盗链,返回真实的文件。否则返回error图片。
让我们设想一下如果现在另外一个网站引用了我们站的图片,并应用到了一篇文章当中。现在有个人请求那个网站的文章,用户的request是向他们的服务器发出的,他们站的服务器返回html让浏览器解析。浏览器解析到我们的图片地址时他会向我们站发起这个图片的请求。因为我们程序的设置这个请求会被转发到我们特定的类做处理,程序判断这个request前面的请求是不是为空(显然它只请求了我们的图片其他没有请求,所以当然没有前面的请求),为空则返回error图片。理解了上面的过程就容易知道为什么请求我们站的那个网页时里面的图片则正确显示了,用户显示request了那个页面,所以里面当然有前面访问的记录。当浏览器解析我们站的图片时候就正确返回了。不知道大家懂了没呢?
代码实现
首先创建一个类继承于IHttpHandler,我这里就叫做ForbiddenInvaliteDownload类了:
IsReusable { ProcessRequest(HttpContext context) { (null != context.Request.UrlReferrer && context.Session["visited"] == "true") { context.Response.Expires = 0; context.Response.Clear(); context.Response.ContentType = "image/jpg"; context.Response.WriteFile(context.Request.PhysicalPath); context.Response.End(); } else { context.Response.Expires = 0; context.Response.Clear(); context.Response.ContentType = "image/jpg"; context.Response.WriteFile(context.Request.PhysicalApplicationPath + "Images/2.jpg"); context.Response.End(); }
这样我们调试的时候调用迅雷下载这个图片就可以发现session里面是没有值的,当然就下载error图片了。