使用Filter来实现图片的防盗链

         Filter是servlet中很是重要的一个类,它就是一个过滤器,过滤器的意思就是拦截某一些你指定的url地址,然后对立面的内容进行截取,根据你的要求来操作数据。它其实就是一个实现了servlet的Filter接口的类,在web.xml里面需要配置。
         配置格式:

       

imageRedirectFilter
ynu.sanwen.testfilter.ImageRedirectFilter


imageRedirectFilter
/images/*

         这个和普通的servlet的配置是一样的,只是那里面的url地址是访问的地址,这里面的是要拦截的地址。上面的配置文件,就是说我们建立的Filter需要对更目录下面的images下面的文件进行拦截,当你要使用这个路径,你就进入到ImageRedirectFilter这个类里面了。

       现在我们就来写ImageRedirectFilter这个类

     

package ynu.sanwen.testfilter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageRedirectFilter implements Filter{

public void destroy() {
System.out.println("ImageRedirectFilter.destroy()");
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;//获得request对象
HttpServletResponse resp=(HttpServletResponse)response;//获得response对象

String referer=req.getHeader("referer");
if(referer==null||!referer.contains(req.getServerName())){
System.out.println("参数1是:"+referer);
System.out.println("参数2是:"+req.getServerName());
req.getRequestDispatcher("/images/error.jpg").forward(req, resp);
}else{
chain.doFilter(req, resp);
}
}

public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("ImageRedirectFilter.init()");
System.out.println(filterConfig.getFilterName());
}

}

         在这个类里面我们就是通过获取来路域名String referer=req.getHeader(“referer”); 和获取servlet的域名filterConfig.getFilterName());来比较,看是不是本站自己访问的,当输入的是图片的路径的时候,referer的结果是null,在if里面进行判断

     if(referer==null||!referer.contains(req.getServerName())){    

                  System.out.println(“参数1是:”+referer);   //打印request里面的域名

                  System.out.println(“参数2是:”+req.getServerName());    //打印servlet的域名

                  req.getRequestDispatcher(“/images/error.jpg”).forward(req, resp);   //如果来路域名为null(也就是直接访问图片地址的时候)或者是来路域名和servlet域名不同的时候,输入错误的图片

}else{    

                chain.doFilter(req, resp);   //否则的话,正常显示

}

     在首页的jsp文件里面添加

     <img alt=”test” src=”images/11111.jpg” width=”500px” height=”300px”>

     效果截图:访问index.jsp文件

                          直接访问图片:

项目下载:http://www.cangzhang.com/wp-content/uploads/2012/09/Filter_images.zip

 

共有 2 条评论

Top