最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS如何顯示防盜鏈的外站圖片技巧示例

 更新時間:2023年09月28日 08:36:22   作者:jsoncode  
通常在開發(fā)測試環(huán)節(jié),一些資源圖片會出現(xiàn)防盜鏈的錯誤提示,本文就通過前端基礎(chǔ)技術(shù),實(shí)現(xiàn)基本的圖片跨站顯示效果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

防盜鏈的原理

  • 服務(wù)端通過請求頭的request.headers.referer來判斷是否是自己資源白名單的請求來源。
  • 如果referer=null,則無法判斷來源,會正常顯示圖片。

所以基于以上理論,可以給圖片創(chuàng)造一個沒有referer的請求環(huán)境就可以實(shí)現(xiàn)了。

解決思路

通過iframe來實(shí)現(xiàn)無referer的請求環(huán)境。

實(shí)現(xiàn)過程

  • 創(chuàng)建一個base64臨時資源,供iframe調(diào)用
  • 在臨時資源中,請求圖片
  • 圖片加載完成后,修改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監(jiān)聽圖片高度

由于當(dāng)前iframe里只有一個圖片,所以監(jiān)聽body高度即可(body有默認(rèn)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如何顯示防盜鏈的外站圖片的詳細(xì)內(nèi)容,更多關(guān)于JS顯示防盜鏈的外站圖片的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

梓潼县| 邯郸市| 青河县| 汉寿县| 内江市| 黑山县| 龙里县| 葫芦岛市| 黎平县| 随州市| 南郑县| 罗江县| 中宁县| 烟台市| 女性| 靖宇县| 绵竹市| 靖边县| 台东县| 溧阳市| 缙云县| 青州市| 邳州市| 富阳市| 海安县| 顺平县| 湾仔区| 班戈县| 萍乡市| 唐山市| 长岭县| 商南县| 梨树县| 吴堡县| 上虞市| 阿克陶县| 博客| 简阳市| 陆丰市| 阳江市| 仁寿县|