在搭建自己的博客网站的时候,很有可能要引入一些外部图片,毕竟多数人最开始不是在自己的平台上写博客。
因某种需要,搬运自己以前写的博客到自己的网站时,在图片这一步可能会出现问题,无法显示。其中往往就是防盗链在起作用了

防盗链

定义

百度百科给的解释是

此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。

可能有点不易懂,通俗的讲,就是 出于某些原因(服务器或图片来源等),从别的网站引入图片到自己的网站中。这样连服务器的存储空间费用都省了( •̀ ω •́ )✧

原理

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

实现

apache 服务器通常使用它的 Url Rewrite功能来实现

具体可参考 这篇文章

反防盗链

任何事物都有相对的两面,既然有了防盗链,那么肯定也有反防盗链。

下载文件

将目标文件下载到自己的服务器,然后从本地读取,这个方法应该算是比较憨厚的一种了。不过准确说这个也不算啥反防盗链

使用代理模式

就是下面详细讲的代理模式

文件代理模式

由于防盗链的关键在于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;
}

最后

就以cnblog上一图片 https://img2018.cnblogs.com/blog/1470456/201812/1470456-20181206174653015-309070173.png 举个例子

如图,转发成功(~ ̄▽ ̄)~

防盗链与springboot代理模式(图片文件转发)的更多相关文章

  1. javascript设计模式实践之代理模式--图片预加载

    图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强. 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的on ...

  2. 【反防盗链】img 标签 访问图片 返回403 forbidden问题

    解决方案,页面头添加 <meta name="referrer" content="no-referrer" /> 隐藏请求体中标注来源referr ...

  3. springboot+thymeleaf 实现图片文件上传及回显

    1. 创建一个springboot工程, 在此就不多说了(目录结构). 2. 写一个HTML页面 <!DOCTYPE html> <html lang="en" ...

  4. Nginx模块学习之————accesskey权限模块使用(Nginx防盗链详细解说),防止别人下载文件和图片

    nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链 1.具体安装教程:http://www.cnblogs.com/tinywan/p/5983694. ...

  5. Nginx中防盗链(下载防盗链和图片防盗链)操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  6. Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录

    日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...

  7. Code笔记 之:防盗链(图片)

    图片防盗链   参考:http://bbs.csdn.net/topics/330080045    应该是”10种图片防盗的方法“,而不是”10种图片防盗链的方法“,不过看搜索防盗链的人要多一点,所 ...

  8. nginx系统真正有效的图片防盗链完整设置详解

    原文:http://www.wufangbo.com/nginx-fang-dao-lian/ 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的 ...

  9. lnmp/nginx系统真正有效的图片防盗链完整设置详解

    http://www.it300.com/article-15345.html 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链! ...

随机推荐

  1. HTML 5+CSS 3网站布局应用教程 (赵振方) 随书光盘 ​

    <HTML5+CSS3网站布局应用教程>全面介绍HTML 5与CSS 3进行Web设计的知识.全书由16章组成.主要内容包括:主流浏览器对HTML 5的支持情况.HTML 5与HTML4在 ...

  2. MVC Action控制方式

    1.Controller 的OnActionExecuting中控制 protected override void OnActionExecuting(ActionExecutingContext ...

  3. 21天学通C++学习笔记(二):C++程序的组成部分

    1. 预处理器编译指令 预处理器是一个在编译前运行的工具. 预处理器编译指令是向预处理器发出的命令,总是以磅字符#大头. #include让预处理器获取指定文件并将它们放在编译指令所处的位置.#inc ...

  4. 【[APIO/CTSC2007]动物园】状压DP

    题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...

  5. php代码审计7审计csrf漏洞

    跨站请求伪造,也有人写出xsrf,黑客伪造用户的http请求,然后将http请求发送给存在csrf的网站,网站执行了伪造的http请求,就引发了跨站请求伪造 漏洞危害:攻击者盗用了你的身份信息,以你的 ...

  6. bzoj1798维护序列

    题目链接 暴力数据结构之线段树$qwq$ 裸题直接敲板子 忘了啥时候写的了$qwq$ 直接上代码吧 /************************************************* ...

  7. 洛谷P3779 [SDOI2017]龙与地下城(概率论+Simpson+FFT)

    题面 传送门 题解 orz shadowice 正态分布 正态分布是随机变量\(X\)的一种概率分布形式.它用一个期望\(\mu\)和方差\(\sigma^2\)就可以描述,记为\(N(\mu,\si ...

  8. DHCP与PPPOE 区别

    1.静态IP的方式,如果是占用一个INTERNET的IP的话,上网都是很贵的,当然这个也是最方便的,开机就能上网,不用做任何拨号或者认证的过程.2.PPPOE,只是多了一个获得IP的过程,一旦获得了I ...

  9. ORA-03113 : end-of-file on communication channel

    现象一: 数据库startup时,出现数据库无法正常mount,并报ORA-03113错误. SQL> startup ORACLE instance started. Total System ...

  10. pip_install的安装

    1.下载get-pip.py https://pip.pypa.io/en/latest/installing/#id9 2.运行 python get-pip.py 3.python -m pip ...