|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你所列的那些其实差不多都可以称为应用服务器(servlet应该说是一种语言更合适)java是开放的,相同的工具就会有很多公司在做,加上java已经发展了很多年了,因此这些工具就很多了。他们很多都是类似的。假如被援用的站对照小如许外站盗链带来的“无感化”流量就给站长带来了压力了(流量也是要钱滴)。关于防盗链能够从两个方面来防,一个是服务器,一个是程序内里判别。各个服务器的判别纷歧样,iis必要安装特定的防盗链软件。我们明天次要会商的是程序里完成防盗链。
道理注释
网上如今对照盛行的是利用handler来完成防盗链。详细的意义以下:专门新建一个针对某种文件哀求的处置类(承继于IHttpHandler)并在web.config内里设置好一切的该文件哀求都指向该类。然后在类内里判别该哀求的前一次哀求是否是存在而且指向我们站的域名,假如存在则以为不是盗链,前往实在的文件。不然前往error图片。
让我们假想一下假如如今别的一个网站援用了我们站的图片,并使用到了一篇文章傍边。如今有团体哀求谁人网站的文章,用户的request是向他们的服务器收回的,他们站的服务器前往html让扫瞄器剖析。扫瞄器剖析到我们的图片地点时他会向我们站倡议这个图片的哀求。由于我们程序的设置这个哀求会被转发到我们特定的类做处置,程序判别这个request后面的哀求是否是为空(明显它只哀求了我们的图片其他没有哀求,以是固然没有后面的哀求),为空则前往error图片。了解了下面的历程就简单晓得为何哀求我们站的谁人网页时内里的图片则准确显现了,用户显现request了谁人页面,以是内里固然有后面会见的纪录。当扫瞄器剖析我们站的图片时分就准确前往了。不晓得人人懂了没呢?
代码完成
起首创立一个类承继于IHttpHandler,我这里就叫做ForbiddenInvaliteDownload类了:
代码
复制代码代码以下:
publicboolIsReusable
{
get{returntrue;}
}
publicvoidProcessRequest(HttpContextcontext)
{
if(null!=context.Request.UrlReferrer)
{
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="text/html";
context.Response.Write("盗链");
context.Response.End();
}
}
代码很少,人人一看就分明了。就是用context.Request.UrlReferrer这个判别一下后面一个哀求是不是存在,存在则以为是正当的,不然分歧法。
仅仅是这个类还不克不及将一切的jpg哀求转发过去,我们必要设置一下webconfig,在System.Web下设置:
代码
复制代码代码以下:
<httpHandlers>
<addverb="*"path="*.jpg"type="Namespace.ForbiddenInvaliteDownload,Namespace"/>
</httpHandlers>
这里还要提到的是IIS默许是不会为JPG文件发送哀求的,而是间接猎取。以是我们还要在iis内里设置一下让一切的jpg哀求都转发到我们的谁人处置程序,而不是iis默许的间接取得。设置如图:
至此,你的网站已能够避免jpg文件被盗了。固然,其他的zip等等文件一样也能够完成,您能够处置一个通用类,依据哀求的后缀判别是甚么范例从而举行操纵。上面是最终效果:
停止了吗
下面的体例其实不能避免迅雷等下载软件的下载,在迅雷内里输出这些地点还是能够下载。假如其余站援用了你的某个.zip的文件链接,如许仍是能够间接下载到的。那该怎样办理呢?我今朝想到的就是到场session考证。
假如用户会见了你的下载页面则在load内里设置session[“visited”]=”true”,然后鄙人载内里增添一个session考证,代码以下(注重,必要承继
System.Web.SessionState.IRequiresSessionState才干利用session):
代码
复制代码代码以下:
if(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图片了。
前几天同学问我学习方向的问题。有点想法,不知道对不对,怕误导同学,现在“开源一下”。注:括号内是我现在整理的时填加上的。 |
|