JS如何显示防盗链的外站图片技巧示例

 更新时间:2023年09月28日 08:36:22   作者:jsoncode  
通常在开发测试环节,一些资源图片会出现防盗链的错误提示,本文就通过前端基础技术,实现基本的图片跨站显示效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

防盗链的原理

  • 服务端通过请求头的request.headers.referer来判断是否是自己资源白名单的请求来源。
  • 如果referer=null,则无法判断来源,会正常显示图片。

所以基于以上理论,可以给图片创造一个没有referer的请求环境就可以实现了。

解决思路

通过iframe来实现无referer的请求环境。

实现过程

  • 创建一个base64临时资源,供iframe调用
  • 在临时资源中,请求图片
  • 图片加载完成后,修改iframe.height=img.height

源码

base64临时资源:

const src = 'http://test.com/test.png';
const html = `data:text/html;base64,${btoa(`<img src="${src}"/>`)}`
<iframe src="html"></iframe>

使用ResizeObserver监听图片高度

由于当前iframe里只有一个图片,所以监听body高度即可(body有默认margin,后面需要清除样式)。(ResizeObserver API)

var ro = new ResizeObserver(entries => {
  for (let entry of entries) {
    const data = {height: entry.contentRect.height};
    window.parent?.postMessage({...data, window: 'parent'}, '*')
    window.top?.postMessage({...data, window: 'top'}, '*')
  }
})
ro.observe(document.body)
window.addEventListener("message", e => {
  if (e.data.window === 'parent') {
      iframe.style.height = e.data.height + 'px'
  }
}, false)

完整代码 (vue3 setup ts)

<script setup lang="ts">
import { onMounted, ref, withDefaults } from 'vue'
interface IProps {
    src: string;
    id?: string
}
const props = withDefaults(defineProps<IProps>(), {});
const iframe = ref(null)
onMounted(() => {
    if (iframe.value) {
        const html = `<style>body{margin:0;}</style>
        <img src="${props.src}" style="display:block"/>
        <script>
            var ro = new ResizeObserver(entries => {
                for (let entry of entries) {
                    const data = {height: entry.contentRect.height, id: "${props.id || props.src}"};
                    window.parent?.postMessage({...data, window: 'parent'}, '*')
                    window.top?.postMessage({...data, window: 'top'}, '*')
                }
            })
            ro.observe(document.body)
        <\/script>`
        iframe.value.src = `data:text/html;base64,${btoa(html)}`
    }
    window.addEventListener("message", e => {
        if (e.data.window === 'parent' && e.data.id === props.src && iframe.value) {
            iframe.value.style.height = e.data.height + 'px'
        }
    }, false)
})
</script>
<template>
    <iframe ref="iframe" style="display: block; border: 0;"></iframe>
</template>

以上就是JS如何显示防盗链的外站图片的详细内容,更多关于JS显示防盗链的外站图片的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript事件Event对象详解(属性、方法、自定义事件)

    JavaScript事件Event对象详解(属性、方法、自定义事件)

    Event对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态,这篇文章主要给大家介绍了关于JavaScript事件Event对象(属性、方法、自定义事件)的相关资料,需要的朋友可以参考下
    2024-01-01
  • 每天一篇javascript学习小结(面向对象编程)

    每天一篇javascript学习小结(面向对象编程)

    这篇文章主要介绍了javascript中的面向对象编程知识点,对面向对象编程进行概述,以及各种方法进行整理,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • JavaScript 应用类库代码

    JavaScript 应用类库代码

    S.Sams Lifexperience CopyRight (C) 2003-2007 S.Sams Lifexperience ScriptClassLib MSNLive: S.Sams#msn.com Update by : 2007-01-19 转载传播请保留版权
    2008-06-06
  • JavaScript结合HTML DOM实现联动菜单

    JavaScript结合HTML DOM实现联动菜单

    这篇文章主要为大家详细介绍了JavaScript结合HTML DOM实现联动菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • JS中递归函数

    JS中递归函数

    编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。这篇文章主要介绍了JS中递归函数的相关资料,需要的朋友可以参考下
    2016-06-06
  • JavaScript实现简单随机点名器

    JavaScript实现简单随机点名器

    这篇文章主要为大家详细介绍了JavaScript实现简单随机点名器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • js去空格技巧分别去字符串前后、左右空格

    js去空格技巧分别去字符串前后、左右空格

    js去空格想必大家多少都会点吧,在接下来的文章中为大家详细介绍下如何分别去字符串前后,左边,右边空格,感兴趣的朋友可以参考下
    2013-10-10
  • javascript 避免闭包引发的问题

    javascript 避免闭包引发的问题

    闭包的功能强大,但如果没有正确理解闭包的概念,其结果往往出乎人的意料。例如,下面是一个较常见的问题
    2009-03-03
  • js 日期转换成中文格式的函数

    js 日期转换成中文格式的函数

    最近的项目需要将日期转换成中文的格式,于是写了个小小的JS函数,使用时直接调用即可.
    2009-07-07
  • 悟透JavaScript整理版

    悟透JavaScript整理版

    编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。
    2008-03-03

最新评论