防止盗链的方法有很多
这里采用如下方法,
方法:判断引用地址
这个方法是最早及最常见的方法。所谓判断引用地址,就是判断浏览器请求时HTTP头的Referer字段的值,这个值在asp.net里面可以用 Request.UrlReferrer属性取得。几个例子来说,在正常情况下当用户在浏览 http://uushare.com/abc.html 时点击一个链接去到 http://uushare.com/jacky.mp3 文件时,浏览器在发出请求jacky.mp3 资源时还会附带当刻浏览器所处的页面地址(即http://uushare.com/abc.html),所以当你的网站程序接收到下载 jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果是从 自己的域名(uushare.com)过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。
这种方法通常用于图片、 mp3这种容易被人用html“嵌入”到其他网站的资源,使用这种方法可以防止你的图片直接出现在别人的网页里(或者防止mp3直接被其他网站嵌入到 flash播放器里),不过访客使用下载工具还是可以轻松下载,因为现在的下载工具一般会自动用你的域名构造一个引用地址,所以如果想再进一步防范的话,可以使用一个对应表限制每个资源的引用地址,例如将 jacky.mp3 的引用地址限制为 http://uushare.com/abc.htmlid=12345,这样下载工具就不太可能构造一个“正确”的引用地址了。
介绍完原理,下面是实例代码(使用filter来进行过滤,因为都是现敲,只附上主要现实部分代码)
doFilter方法部分代码
HttpServletRequest httpRequest = (HttpServletRequest)request ;
HttpServletResponse httpResponse = (HttpServletResponse)response;
String referer = httpRequest.getHeader("referer");
String contextPath = httpRequest.getContextPath();
String uri = httpRequest.getRequestURI();
uri = formatUri(uri);
String subUri = uri.subString(contextPath.length);
if(referer==null && uriPass(subUri)){
String redirectPage = "/myProgect/errorPage.jsp";
httpResponse.sendRedirect(contextPath+redirectPage) ;
return;
}
chain.doFilter(request , response);
//继续执行其他filter 如 request.setCharacterEncoding("UTF-8");
=========补充方法=====
private String formatUri(String oldUri){
if(oldUri != null){
oldUri = StringUtils.replaceChars(oldUri,"\\","/");
if(oldUri.contains("/")){
String uriArray = StringUtils.split(oldUri,"/")
String new Str = "";
if(uriArray.length>0){
for(int i,i newStr = newStr.concat("/").concat( StringUtils.replaceChars(uriArray[i],"/","")); } } oldUri = newStr; } } return oldUri; } private boolean uriPass(String uri){ boolean flag = true ; if(uri.endsWith("/errorPage.jsp") ||uri.endsWith("/index.jsp")){ flag = false; } return flag; }