反防盗链

最近一个项目要从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这个参数不了解,,大家可以百度查查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值