最近一个项目要从web上抓取图片,遇到目标网站图片做了防盗链处理,以前项目里的防盗链代码是写在jsp里的,直接访问流文件,然后直接输出。
<%@page contentType="image/jpeg" import="java.io.OutputStream,java.io.InputStream,java.net.URL,java.net.URLConnection" language="java"
pageEncoding="UTF-8"%><%
//response.reset();
OutputStream os = null;
InputStream in =null;
try{
os = response.getOutputStream();
String picPath = request.getQueryString();
picPath = picPath.substring(4,picPath.length());
URLConnection u = new URL(picPath).openConnection();
in = u.getInputStream();
if (null != in) {
int len;
byte[] b = new byte[1024];
while ((len = in.read(b)) != -1) { //循环读取
os.write(b, 0, len); // 写入到输出流
}
os.flush();
in.close();
}
os.close();
out.clear();
out = pageContext.pushBody();
}catch(Exception e){
//e.printStackTrace();
}finally{
if(in!=null){
in.close();
}
if(os!=null){
os.close();
}
if(out!=null){
out.clear();
}
}
%>
这个代码是前辈写的,但是目标网站经过处理,发现这个代码已经不适应了。所以上网查了一下防盗链的基本思想。
发现这句话“http标准协议中有专门的字段记录referer,一来可以追溯上一个入站地址是什么 ,二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
,因此所有防盗链方法都是基于这个Referer字段”
所以我想,请求的时候把这个referer字段带进去应该能解决问题,所以在网上找到了以下的代码
<%@page contentType="image/jpeg;charset=UTF-8" language="java"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.net.URL"%>
<%@page import="java.util.zip.GZIPInputStream"%>
<%@page import="java.io.InputStream"%>
<%@page import="java.net.URLConnection"%>
<%@page import="java.io.File"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="com.hanweb.util.FileUtil"%>
<%@page import="java.io.FileOutputStream"%>
<%
OutputStream os = null;
try {
String picPath = request.getQueryString();
picPath = picPath.substring(4,picPath.length());
URL url = new URL(picPath);
URLConnection con = url.openConnection();
int index = picPath.indexOf("/", 10);
con.setRequestProperty("Host", index == -1 ? picPath.substring(7) : picPath.substring(7, index));
con.setRequestProperty("Referer", picPath);
InputStream is = con.getInputStream();
if (con.getContentEncoding() != null && con.getContentEncoding().equalsIgnoreCase("gzip")) {
is = new GZIPInputStream(con.getInputStream());
}
os = response.getOutputStream();
byte[] bs = new byte[1024];
int len = -1;
try {
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.flush();
out = pageContext.pushBody();
} finally {
try {
os.close();
} catch (Exception ex) {}
try {
is.close();
} catch (Exception ex) {}
}
} catch (Exception ex) {
ex.printStackTrace();
}
%>
这样就解决问题了。
可能有的同学对referer这个参数不了解,,大家可以百度查查