English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 文件防盗链的实现(含源码)

 

文件防盗链的实现(含源码)

威盾防火墙 2015-02-28

 

问题: 
  由于公司是做网站的,因此会有素材服务器,以前在网站中所有用到素材的地方都直接写的素材文件的绝对下载地址,因此素材的目录部署结构都被暴露在网络中,这样就出现了两个问题:

  1,素材服务器的目录结构部署很容易被人了解到.

  2,素材没有签权,容易被盗链

郭靖听到这个两个问题,下午没事就试着实现了防盗链,以下是郭靖的解决方案:

郭靖利用了urlrewriter和文件流输出解决了这个问题,

urlrewriter是url重新定向,把原有的符合某些规则的url定向到一个jsp,然后在这个jsp里实现签权 ,下面郭靖将带您一步一步实现这个防盗链

 

第一步:新建工程,引入依赖包,在本例子中需要引用urlrewrite-3.0.4.jar包

下图是我的目录结构图


 

第二步:在web.xml中配置urlrewriter的过滤器,配置如下:

Web.xml代码 
<?xml version="1.0" encoding="UTF-8"?>    
<web-app version="2.4"     
    xmlns="http://java.sun.com/xml/ns/j2ee"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee     
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    
   
    <filter><!-- 配置urlRewriter过滤器 -->    
    <filter-name>UrlRewriteFilter</filter-name>    
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>    
    <init-param>    
      <description>是否可以重新载入</description>    
      <param-name>confReloadCheckEnabled</param-name>    
      <param-value>true</param-value>    
    </init-param>    
    <init-param>    
      <description>重新载入时间</description>    
      <param-name>confReloadCheckInterval</param-name>    
      <param-value>1800</param-value>    
    </init-param>    
  </filter>    
  <filter-mapping>    
    <filter-name>UrlRewriteFilter</filter-name>    
    <url-pattern>/*</url-pattern>    
    <dispatcher>REQUEST</dispatcher>    
    <dispatcher>FORWARD</dispatcher>    
  </filter-mapping>    
  <welcome-file-list>    
    <welcome-file>index.jsp</welcome-file>    
  </welcome-file-list>    
   
</web-app>   
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
 xmlns="http://java.sun.com/xml/ns/j2ee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <filter><!-- 配置urlRewriter过滤器 -->
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    <init-param>
      <description>是否可以重新载入</description>
      <param-name>confReloadCheckEnabled</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <description>重新载入时间</description>
      <param-name>confReloadCheckInterval</param-name>
      <param-value>1800</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>


第三步:配置urlrewrite.xml,设置url转化规则

Urlrewrite.xml代码 
<?xml version="1.0" encoding="utf-8"?>    
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN" "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">    
<!--    
    Configuration file for UrlRewriteFilter    
    http://tuckey.org/urlrewrite/    
-->    
<urlrewrite>    
    <!-- 编写url转换规则,把所有mp3的访问全部都转移到downloadmp3.jsp进行处理 -->    
    <rule enabled="true">    
        <from>/mp3file/(.+)</from>    
        <to>/mp3/downloadmp3.jsp?file=$1</to>    
    </rule>    
   
</urlrewrite>   
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN" "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
<!--
    Configuration file for UrlRewriteFilter
    http://tuckey.org/urlrewrite/
-->
<urlrewrite>
    <!-- 编写url转换规则,把所有mp3的访问全部都转移到downloadmp3.jsp进行处理 -->
 <rule enabled="true">
  <from>/mp3file/(.+)</from>
  <to>/mp3/downloadmp3.jsp?file=$1</to>
 </rule>

</urlrewrite>


第四步:编写文件下载签权使用的downloadmp3.jsp,代码如下

Downloadmp3.jsp代码 
<%@page language="java"  pageEncoding="gb2312"%>       
<%@page import="java.io.FileInputStream"%>    
<%       
  //可以在这里先完成签权,检查该用户是否有资格进行mp3文件下载    
  //采用文件流输出的方式处理mp3下载:       
  String filename=request.getParameter("file");    
  response.reset();//可以加也可以不加       
  response.setContentType("audio/mpeg");   //设置返回头类型    
      
  //设置下载时显示的文件名    
  response.addHeader("Content-Disposition","attachment;filename="+filename  );       
      
  java.io.OutputStream outp=null;       
  java.io.FileInputStream in=null;      
      
  //文件所在的真实路径    
  String realfilepath="D:\y\testdownload\WebRoot\mp3\download\";    
       
  try       
  {       
  outp=response.getOutputStream();    
  in=new FileInputStream(realfilepath+filename);       
   
  byte[] b=new byte[1024];       
  int i=0;       
      
  while((i=in.read(b)) >0)       
  {       
  outp.write(b, 0, i);       
 }         
       
  outp.flush();       
  out.clear();       
  out=pageContext.pushBody();       
 }       
  catch(Exception e)       
  {       
  System.out.println("Error!");       
  e.printStackTrace();       
 }       
  finally       
  {       
  if(in != null)       
  {       
  in.close();       
  in=null;       
   
 }       
      
 }       
%>     
<%@page language="java"  pageEncoding="gb2312"%>   
<%@page import="java.io.FileInputStream"%>
<%   
  //可以在这里先完成签权,检查该用户是否有资格进行mp3文件下载
  //采用文件流输出的方式处理mp3下载:   
  String filename=request.getParameter("file");
  response.reset();//可以加也可以不加   
  response.setContentType("audio/mpeg");   //设置返回头类型
  
  //设置下载时显示的文件名
  response.addHeader("Content-Disposition","attachment;filename="+filename  );   
  
  java.io.OutputStream outp=null;   
  java.io.FileInputStream in=null;  
  
  //文件所在的真实路径
  String realfilepath="D:\y\testdownload\WebRoot\mp3\download\";
   
  try   
  {   
  outp=response.getOutputStream();
  in=new FileInputStream(realfilepath+filename);  

  byte[] b=new byte[1024];   
  int i=0;   
  
  while((i=in.read(b)) >0)   
  {   
  outp.write(b, 0, i);   
 }     
   
  outp.flush();   
  out.clear();   
  out=pageContext.pushBody();   
 }   
  catch(Exception e)   
  {   
  System.out.println("Error!");   
  e.printStackTrace();   
 }   
  finally   
  {   
  if(in != null)   
  {   
  in.close();   
  in=null;  

 }   
  
 }   
%> 


OK,到此我们的文件防盗链功能也就完成了,你现在可以实现一下,在浏览器地址栏输入出mp3地址,就会被跳到filedown.jsp,你可以在downloadmp3.jsp中完成签权以及其它需要的工作,而且从用户体验来讲,他根本感觉不到这是在访问一个jsp,用户看到的还是在下功一个普通的mp3文件而已


附件是该例子的eclipse源码工程,供朋友们参考

 


相关内容: 最新内容:
教你如何用ISAPI_Rewrite做IIS防盗链[2015-02-28]
利用Varnish实现图片防盗链[2015-02-26]
利用ADODB.Stream 防盗链[2015-02-25]
流媒体服务器防盗链插件-Auth Plug[2015-02-25]
PHP做好防盗链的基本思想 防盗链的设置方法[2015-02-07]
1.5.3 防盗链配置实例[2015-02-05]
黑客怎样“挂马”?[2015-02-28]
教你如何用ISAPI_Rewrite做IIS防盗链[2015-02-28]
从网站日志来简单分析和预防黑客的入侵[2015-02-28]
分层纵深防御,一切黑客入侵都是浮云[2015-02-28]
如何防止黑客入侵之攻击者如何搞定你的口令/密码?[2015-02-28]
如何防范黑客入侵[2015-02-28]