在做一个社交网站时发现,在页面html中通过<img src=""> 直接引用网络资源时,部分图片无法显示。
发现:这些无法显示的资源,是在服务器端做了referer禁用处理,这样就只能把资源下载到自己的服务器使用了。
referer禁用:客户端在向服务器请求时,会通过"referer" 属性传递发起请求的域名,要是与资源域名不能匹配就不允许访问。
为此,本虾米写了一个伪造referer的小应用,用于获取网络资源,并保存到自己的服务器。
不再赘述了,直接上代码:
/* fileUrl网络资源地址 */
public static boolean saveUrlAs(String fileUrl, String savePath){
try {
/* 将网络资源地址传给,即赋值给url */
URL url = new URL(fileUrl);
/*获取资源路径的主域名*/
String refererUrl = getRefererUrl2(fileUrl);
/* 此为联系获得网络资源的固定格式用法,以便后面的in变量获得url截取网络资源的输入流 */
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon;)");
connection.setRequestProperty("Accept-Encoding", "gzip");
/*伪造referer资源信息*/
connection.setRequestProperty("referer", refererUrl);
connection.setRequestProperty("cookie", refererUrl);
DataInputStream in = new DataInputStream(connection.getInputStream());
/* 此处也可用BufferedInputStream与BufferedOutputStream 需要保存的路径*/
DataOutputStream out = new DataOutputStream(new FileOutputStream(savePath));
/* 将参数savePath,即将截取的图片的存储在本地地址赋值给out输出流所指定的地址 */
byte[] buffer = new byte[1024];
int count = 0;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
out.close();
in.close();
connection.disconnect();
return true;
} catch (Exception e) {
System.out.println(e + fileUrl + savePath);
return false;
}
}
/**
* 根据资源路径截取资源的域名信息
* @param url
* @return
*/
public static String getRefererUrl2(String url){
String result = "";
Pattern p = Pattern.compile("http://((\\w)+\\.)+\\w+");
Matcher m = p.matcher(url);
if(m.find()){
result = m.group();
}
return result;
}
public static void main(String[] args) {
String photoUrl = "http://pic2.zhimg.com/1e9e403b7b871ecc5a9f783df550f5da_b.jpg";
String fileName = photoUrl.substring(photoUrl.lastIndexOf("/"));
String filePath = "d:/photosFile";
saveUrlAs(photoUrl, filePath+fileName);
}