JS如何顯示防盜鏈的外站圖片技巧示例
防盜鏈的原理
- 服務(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)文章
JavaScript事件Event對(duì)象詳解(屬性、方法、自定義事件)
Event對(duì)象代表事件的狀態(tài),比如事件在其中發(fā)生的元素、鍵盤按鍵的狀態(tài)、鼠標(biāo)的位置、鼠標(biāo)按鈕的狀態(tài),這篇文章主要給大家介紹了關(guān)于JavaScript事件Event對(duì)象(屬性、方法、自定義事件)的相關(guān)資料,需要的朋友可以參考下2024-01-01

JavaScript結(jié)合HTML DOM實(shí)現(xiàn)聯(lián)動(dòng)菜單

JavaScript實(shí)現(xiàn)簡(jiǎn)單隨機(jī)點(diǎn)名器