Java破解图片防盗链-图片文件转发

Java破解图片防盗链-图片文件转发

原理

防盗链实现的原理就是:http协议中有个叫referer的表头字段,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源,就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。

文件代理模式

由于防盗链的关键在于referer头部, 而浏览器获取图片时,它会老实的填上真是来源。比如从某个博客访问,就填上博客地址。不过我们手动访问图片地址时,是不带referer的,这时就可以访问。因此,我们可以实现一个代理模式,来转发图片。
比如有防盗链的图片地址 www.aa.com, 服务器地址 www.bb.com, 先让服务器来请求(不带referer)得到图片,再将请求到的图片转发给目标网站(比如个人博客网站)。也就是博客上的图片src直接填

www.bb.com/forward?url=www.aa.com

当然我们要在服务器上实现相应的图片转发功能。

下面将以springboot 为例,实现图片转发:

 @RequestMapping(value = "/forward")
    public ResponseEntity<Resource> forward(@RequestParam(name = "url", required = true) String url){
        System.out.println("Start: ------------------------->");

        Resource resource = null;

        InputStream inputStream;
        try {
            inputStream = new URL(url).openStream();

            resource = new ByteArrayResource(toByteArray(inputStream));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_PNG)
                .header(HttpHeaders.CONTENT_DISPOSITION, " filename=\"" + getFileName(url) + "\"")
                .body(resource);
    }

加上ResponseEntity是为了更好的控制Response,比如响应的头部信息等。

其中的toByteArray()函数为

 private byte[] toByteArray(InputStream in){
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            byte[] bytes = new byte[1024];
            int n;
            while ((n = in.read(bytes)) != -1){
                byteArrayOutputStream.write(bytes, 0, n);
            }
            System.out.println(byteArrayOutputStream.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return byteArrayOutputStream.toByteArray();
    }

getFileName()函数为

 private String getFileName(String url){
        String[] strs = url.split("/");
        for (String str: strs){
            // 这里我仅处理png格式的,根据需求修改即可
            if (str.toLowerCase().endsWith(".png")){
                return str;
            }
        }
        return null;
    }

原文地址

如图,转发成功(~ ̄▽ ̄)~
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值