想做一个防盗链的demo,查了一些资料,知道这个demo的要点是改变静态图片请求的默认处理方式(存在即返回),增加可编程性,通过代码控制逻辑判断是否为盗链,最后决定是否返回正确图片。
参考:http://www.mikesdotnetting.com/article/126/asp-net-mvc-prevent-image-leeching-with-a-custom-routehandler
这篇文章提到,如果被请求的图片存在磁盘上,那么会被立即返回,如果不存在磁盘上,会做路由匹配,这就是入口,所以我在首页将img标签的src属性指向磁盘不存在的文件夹上,
Index.cshtml:
<img src="~/Content/imagessss/a.png" />
指向不存在的文件夹imagessss
添加路由:
routes.Add("ImagesRoute", new Route("Content/imagessss/{filename}", new ImageRouteHandler()));
图片路由处理类ImageRouteHandler.cs:
public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new ImageHandler(requestContext); }
实际处理类ImageHandler.cs就不贴出来了,要点是图片请求可以匹配到ImageRouteHandler.cs上。
疑问点:我尝试了好多遍,不管请求指向是否存在磁盘上,请求都不会进行路由匹配,除非我在web.config添加配置:runAllManagedModulesForAllRequests="true",并且设置RouteTable.Routes.RouteExistingFiles = true;,这两条必须都设置为true,图片请求才会有路由匹配,当然,不论请示指向的文件夹是否存在。这和参考文有较大出入了?前者通过请求的文件是否存在决定是否匹配路由,后者(我现在的方式)是产用一棒子方式,设置所有请求都通过路由匹配,问题出在哪儿???
没有多余的豆了,谢谢你的回答!!