9.4 示例2:图像文件保护Filter
项目描述
本例中的图像文件保护Filter
用于防止用户在浏览器地址栏中直接输入图像的URL
路径来下载图像。应用中只显示通过<img/>
标签链接的图片
原理
该Filter
的实现原理是检查HTTP Header
的referer
值。如果该值为null
,就意味着当前的请求中没有referer
值,即当前的请求是直接通过输入URL
来访问该资源的。如果资源的Header
值为非空,将返回Request
语法的原始页面作为referer
值。
ImageProtectorFilter.java
Filter
实现类ImageProtectorFilter.java
如下所示,从WebFilter
的Annotation
中,可以看到该Filter
应用于所有的.png
、.jpg
、.gif
文件后缀。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| package filter; 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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; @WebFilter( filterName = "ImageProtetorFilter", urlPatterns= {"*.png","*.jpg","*.gif"} ) public class ImageProtectorFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void destroy() {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException { System.out.println("ImageProtectorFilter"); HttpServletRequest httpServletRequest = (HttpServletRequest) request; String referrer = httpServletRequest.getHeader("referer"); System.out.println("referrer:" + referrer); if(referrer != null) { filterChain.doFilter(request, response); } else { throw new ServletException( "Image not available"); } } }
|
代码详解
这里并没有init
和destroy
方法。其中doFilter
方法读取到Header
中的referer
值,要确认是要继续处理这个资源还是给个异常:
1 2 3 4 5 6 7
| String referrer = httpServletRequest.getHeader("referer"); System.out.println("referrer:" + referrer); if (referrer != null) { filterChain.doFilter(request, response); } else { throw new ServletException("Image not available"); }
|
image.jsp
1 2
| avatar.png:<br> <img alt='avatar.png' src='image/avatar.png' />
|
图片资源
在WebContent
目录下创建image
目录,在image
目录中粘贴如下图片(avatar.png
):
项目结果如下图所示:
运行效果
浏览器地址栏中输入地址访问图片
测试该Filter
,可以在浏览器地址栏中输入如下ULR
路径,尝试访问logo.png
图像:
1
| http://localhost:8080/app09a/image/avatar.png
|
将会得到“Image not available
”的错误提示。如下图所示:
jsp页面中图片的显示效果
接下来,通过image.jsp
的页面来访问该图像:
http://localhost:8080/app09a/image.jsp
可以访问到该图像了,如下图所示:
这种方法生效的原因是image.jsp
页面中包含了通知浏览器下载图像的链接:
1
| <img alt='avatar.png' src='image/avatar.png' />
|
当浏览器通过该链接
获取图像资源时,它也将该页面的URL
(本示例中为http://localhost:8080/app09a/image/avatar.png
)作为Header
的referer
值传到服务中。可以在浏览器中按下F12
查看该图片的请求头中的Referer
信息,如下图所示: