效果: 如果其他的网站引用本网站的图片资源或者直接访问图片资源,将直接返回,无任何效果。只有本网站的网页引用时,图片才会正常显示。
原理:在图片显示之前对 Request 进行验证,看客户请求是否来自本网站内。
代码如下:
package cn.joker.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
// 获取链接来源
String referer = req.getHeader("referer");
System.out.println(referer);
// 判断是直接访问还是通过其它网站访问
System.out.println(req.getServerName());
if(referer == null || !referer.contains(req.getServerName()))
// 不作任何处理
return;
else
chain.doFilter(req, res);
}
}
// web.xml
<filter>
<filter-name>imageFilter</filter-name>
<filter-class>cn.joker.filter.ImageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>imageFilter</filter-name>
<url-pattern>/images/*</url-pattern>
</filter-mapping>
在web.xml 中配置 filter。所有访问网站 / images/ 下的资源都将被拦截 。(通过打印输出即可观察到)。并不只是拦截 Servlet 或者 JSP。