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

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

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

防盜鏈的原理

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

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

解決思路

通過(guò)iframe來(lái)實(shí)現(xiàn)無(wú)referer的請(qǐng)求環(huán)境。

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

  • 創(chuàng)建一個(gè)base64臨時(shí)資源,供iframe調(diào)用
  • 在臨時(shí)資源中,請(qǐng)求圖片
  • 圖片加載完成后,修改iframe.height=img.height

源碼

base64臨時(shí)資源:

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

使用ResizeObserver監(jiān)聽(tīng)圖片高度

由于當(dāng)前iframe里只有一個(gè)圖片,所以監(jiān)聽(tīng)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顯示防盜鏈的外站圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

霸州市| 拉萨市| 东乌| 区。| 潼关县| 洪湖市| 晋宁县| 花莲县| 宝应县| 全椒县| 竹溪县| 弥渡县| 札达县| 谢通门县| 和林格尔县| 高密市| 永胜县| 江北区| 贵阳市| 景洪市| 江门市| 上高县| 延寿县| 南京市| 手游| 连州市| 崇州市| 黑山县| 裕民县| 方城县| 东山县| 洛隆县| 滨海县| 保山市| 平和县| 石柱| 陕西省| 固安县| 新晃| 龙游县| 甘洛县|