日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript 如何禁止用戶保存圖片

瀏覽:120日期:2023-10-08 08:20:00

場景

在業務需求中不希望用戶保存圖片,因為是一些供內部使用的圖片。

思路

添加事件禁止選擇、拖拽、右鍵(簡單的禁止用戶保存圖片,但無法阻止用戶打開控制臺查看,或是直接抓包) 將之轉換為 canvas(讓瀏覽器認為不是圖片以此禁止用戶對之進行圖片的操作,但無法阻止抓包) 禁止用戶使用控制臺查看源碼(阻止瀏覽器打開控制臺,但無法阻止抓包) 傳輸圖片使用自定義格式(可以阻止抓包,但需要后臺配合)

注:以下內容使用 react+ts 實現

添加事件禁止選擇、拖拽、右鍵

簡而言之,這是一種簡單有效的方式,能夠在用戶不打開控制臺的情況下阻止用戶保存圖片。

export function preventDefaultListener(e: any) { e.preventDefault()};<img src={props.url} alt='' style={{ //禁止用戶選擇 userSelect: ’none’, //禁止所有鼠標事件,過于強大,圖片僅用于展示可用 // pointerEvents: ’none’, }} onTouchStart={preventDefaultListener} onContextMenu={preventDefaultListener} onDragStart={preventDefaultListener}/>

將之轉換為 canvas

另一種思路是將圖片轉換為 canvas 避免用戶使用 img 相關的操作。

將圖片轉成 canvas

export async function imageToCanvas(url: string, canvas: HTMLCanvasElement) { return new Promise((resolve, reject) => { //新建Image對象,引入當前目錄下的圖片 const img = new Image() img.src = url const c = canvas.getContext(’2d’)! //圖片初始化完成后調用 img.onload = function () { //將canvas的寬高設置為圖像的寬高 canvas.width = img.width canvas.height = img.height //canvas畫圖片 c.drawImage(img, 0, 0, img.width, img.height) resolve() } img.addEventListener(’error’, (e) => { reject(e) }) })}

禁用 canvas 事件

const throwFn = () => { throw new Error( 'Uncaught DOMException: Failed to execute ’toDataURL’ on ’HTMLCanvasElement’: Tainted canvases may not be exported.', )}const $canvasRef = useRef<HTMLCanvasElement>(null) useEffect(() => { ;(async () => { await imageToCanvas(props.url, $canvasRef.current!) $canvasRef.current!.toBlob = throwFn $canvasRef.current!.toDataURL = throwFn })() }, []) return ( <canvas ref={$canvasRef} onTouchStart={preventDefaultListener} onContextMenu={preventDefaultListener} /> )

禁止用戶使用控制臺查看源碼

如果能禁止用戶操作控制臺,那么自然能夠避免用戶查看源碼了,下面是一個簡單的實現。

/** * 兼容異步函數的返回值 * @param res 返回值 * @param callback 同步/異步結果的回調函數 * @typeparam T 處理參數的類型,如果是 Promise 類型,則取出其泛型類型 * @typeparam Param 處理參數具體的類型,如果是 Promise 類型,則指定為原類型 * @typeparam R 返回值具體的類型,如果是 Promise 類型,則指定為 Promise 類型,否則為原類型 * @returns 處理后的結果,如果是同步的,則返回結果是同步的,否則為異步的 */export function compatibleAsync<T = any, Param = T | Promise<T>, R = T>( res: Param, callback: (r: T) => R,): Param extends Promise<T> ? Promise<R> : R { return (res instanceof Promise ? res.then(callback) : callback(res as any)) as any}/** * 測試函數的執行時間 * 注:如果函數返回 Promise,則該函數也會返回 Promise,否則直接返回執行時間 * @param fn 需要測試的函數 * @returns 執行的毫秒數 */export function timing<R>( fn: (...args: any[]) => R, // 函數返回類型是 Promise 的話,則返回 Promise<number>,否則返回 number): R extends Promise<any> ? Promise<number> : number { const begin = performance.now() const res = fn() return compatibleAsync(res, () => performance.now() - begin)}/** * 禁止他人調試網站相關方法的集合對象 */export class AntiDebug { /** * 不停循環 debugger 防止有人調試代碼 * @returns 取消函數 */ public static cyclingDebugger(): Function { const res = setInterval(() => { debugger }, 100) return () => clearInterval(res) } /** * 檢查是否正在 debugger 并調用回調函數 * @param fn 回調函數,默認為重載頁面 * @returns 取消函數 */ public static checkDebug( fn: Function = () => window.location.reload(), ): Function { const res = setInterval(() => { const diff = timing(() => { debugger }) if (diff > 500) { console.log(diff) fn() } }, 1000) return () => clearInterval(res) }}

傳輸圖片使用自定義格式

該功能需要服務端配合,故而此處贊不實現,可以參考 微信讀書,就是將文本轉為 canvas,數據傳輸也進行了加密,可以在很大程度上防止普通用戶想要復制/下載的行為了。

總結

如同所有的前端限制用戶的技術一樣,這是一個沒有終點的斗爭。。。

以上就是JavaScript 如何禁止用戶保存圖片的詳細內容,更多關于JavaScript 禁止保存圖片的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线精品一区| 国产精品羞羞答答在线观看| 美腿丝袜亚洲三区| 中文字幕日韩亚洲| 亚洲另类视频| 亚洲人成亚洲精品| 日韩高清欧美激情| 欧美一区二区三区久久| 深夜福利一区| 日韩动漫一区| 欧美精品中文| 国产精品日本一区二区三区在线 | 国产一区二区精品久| 久久精品国产99| 国产中文字幕一区二区三区| 中文字幕在线看片| 久久电影tv| 99久久99久久精品国产片果冰| 久久美女精品| 亚洲少妇一区| 日韩一区精品| 美日韩一区二区三区| 给我免费播放日韩视频| 中文字幕成在线观看| 99精品在线| 蜜桃视频第一区免费观看| 日韩中文字幕无砖| 国产日产精品一区二区三区四区的观看方式 | 亚洲精品视频一二三区| 日韩高清欧美激情| 精品国产不卡| 神马日本精品| 一区二区国产精品| 欧美一区精品| 国产在线不卡一区二区三区| 99精品在线观看| 日韩制服丝袜av| 欧美亚洲国产日韩| 久久电影tv| 久久国产精品久久w女人spa| 日韩精品一级| 日韩1区在线| 99久久久国产精品美女| 美女久久一区| 国产亚洲第一伦理第一区| 精品久久视频| 狠狠干综合网| 日本午夜精品久久久| 久久久久久婷| 香蕉成人久久| 欧美精品不卡| 久久亚洲成人| 午夜久久av| 高清不卡一区| 免费看日韩精品| 国产成人精品一区二区三区在线| 国产中文一区| 四虎精品一区二区免费| 国产在线一区不卡| 在线精品视频一区| 在线看片福利| 午夜精品福利影院| 久久青青视频| 日韩精品成人在线观看| 日韩成人综合| 日本不卡视频在线| 精品国模一区二区三区| 日韩中文字幕视频网| 欧美日韩视频网站| 日韩有码av| 欧美日韩激情在线一区二区三区| 国产日韩一区二区三区在线| 久久激情网站| 国产精成人品2018| 亚洲资源在线| 亚洲国产综合在线看不卡| 国产极品一区| 日韩精品第一| 丝瓜av网站精品一区二区| 日韩综合在线| 日韩精选在线| 视频一区国产视频| 99久久婷婷这里只有精品| 久久wwww| 日韩av一区二区三区| 中文日韩欧美| 国产在线日韩| www.com.cn成人| 国产精品成人**免费视频| 中文一区一区三区免费在线观| 四虎国产精品免费观看| 一区二区电影| 在线综合亚洲| 国产成人精品一区二区三区免费| 国产私拍福利精品视频二区| 亚洲高清激情| 你懂的国产精品永久在线| 欧美日韩国产探花| 国产日韩在线观看视频| 亚洲精品九九| 久久久成人网| 欧美a一区二区| 蜜臀久久99精品久久久画质超高清| 精品国产精品久久一区免费式| 蜜臀久久久99精品久久久久久| 黑人精品一区| 国产毛片一区二区三区| 香蕉久久夜色精品国产| 国产一区二区三区探花| 欧美aⅴ一区二区三区视频| 一本一道久久a久久| 久久精品二区三区| 精品一区二区三区免费看| 中文字幕成人| 日韩午夜免费| 成人羞羞视频在线看网址| 国产农村妇女精品一二区| av亚洲一区二区三区| 美女久久久久久| 亚洲区欧美区| 一级欧洲+日本+国产| 视频在线不卡免费观看| 国产精品白丝久久av网站| 最新国产精品| 欧美va天堂在线| 欧美+日本+国产+在线a∨观看| 日本精品黄色| 欧美激情麻豆| 国产午夜久久av| 日本视频一区二区| 午夜电影一区| 亚洲在线一区| 美女网站久久| 欧美成人亚洲| 日韩在线视频精品| 日本激情一区| 国产suv精品一区二区四区视频 | 欧美色图一区| 超碰超碰人人人人精品| 老司机免费视频一区二区三区| 91麻豆精品| 日本一区二区中文字幕| 亚洲网站视频| 日韩电影二区| 红杏一区二区三区| 精品国产aⅴ| 国产极品一区| 国产美女高潮在线| 美女福利一区二区三区| 日韩久久精品| 久久国产直播| 亚洲性视频h| 欧美特黄一级大片| 亚洲制服少妇| 亚洲欧洲专区| 每日更新成人在线视频| 免费久久精品视频| 国产精品毛片一区二区三区| 在线一区视频| 国产视频欧美| 99国产精品久久久久久久| 亚洲精品护士| 欧美在线首页| 欧美国产不卡| 四虎8848精品成人免费网站| 91亚洲国产| 久久婷婷av| 日韩中出av| 麻豆久久一区| 亚洲黄色免费av| 久久黄色影院| 亚洲专区欧美专区| 亚洲欧美视频| 久久三级中文| 国产福利91精品一区二区| 香蕉成人av| 好吊视频一区二区三区四区| 亚洲欧美不卡| 日韩激情一二三区| 老牛国内精品亚洲成av人片| 成人日韩在线观看| 亚洲免费网址| 国产免费av国片精品草莓男男| 国产在线一区不卡| 99精品美女| 国产一区二区三区成人欧美日韩在线观看| 在线日韩欧美| 偷拍亚洲精品| 麻豆精品一区二区综合av| 久久久久97| 99热精品久久| 视频在线观看91| 红杏一区二区三区| 黄色亚洲大片免费在线观看| 日产欧产美韩系列久久99| 精品午夜av| 一本色道精品久久一区二区三区| 日韩精彩视频在线观看| 久久一区二区中文字幕| 日本伊人久久|