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

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

JavaScript 如何禁止用戶保存圖片

瀏覽:119日期: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久久,三上悠亚国产精品一区二区三区
91tv亚洲精品香蕉国产一区| 不卡一区综合视频| 日韩精选在线| 亚洲2区在线| 久久精品xxxxx| 欧美精品成人| 久久久久久色 | 国产91欧美| 国产v综合v| 国产精品日韩久久久| 中文无码日韩欧| 99热免费精品| 日韩av电影一区| 久久99高清| 欧美1区2区3区| 视频一区在线视频| 91精品麻豆| 乱一区二区av| 日韩在线观看不卡| 先锋影音国产一区| 88久久精品| 国产在线一区不卡| 欧美成人高清| 91成人在线网站| 欧美久久天堂| 蜜桃传媒麻豆第一区在线观看| 国产精品毛片一区二区三区| 日韩精品一区二区三区中文字幕| 国模精品一区| 日韩在线一二三区| 精品免费在线| 中文一区一区三区免费在线观| 麻豆久久久久久| 久久午夜精品一区二区| 精品视频高潮| 日韩在线观看一区二区| 蜜桃久久久久| 99视频精品| 久久久久97| 99热免费精品| 久久91视频| 激情五月色综合国产精品| 日本欧美一区二区| 日韩精品影视| 国产精品高清一区二区| 久久久成人网| 国产精品手机在线播放| 香蕉成人av| 日本aⅴ免费视频一区二区三区| 久久精品国产999大香线蕉| 欧美高清不卡| 国产精品久久久久久久久免费高清| 欧美日韩在线二区| 国产伦精品一区二区三区千人斩| 激情婷婷综合| 国产精品99一区二区三区| 91久久国产| 久久精品免费看| 亚洲资源网站| 99久久99视频只有精品| 久久只有精品| 91亚洲精品在看在线观看高清| 伊人久久亚洲影院| 亚洲精品在线影院| 久久福利在线| 欧美伊人久久| 蜜桃av一区二区在线观看| 福利一区二区| 欧美日韩一区二区三区不卡视频 | 欧美亚洲一区二区三区| 国产精品7m凸凹视频分类| 国产v日韩v欧美v| 欧美精品91| 欧美一区二区三区久久精品| 首页欧美精品中文字幕| 欧美女激情福利| 久久久久.com| 日韩精品第一区| а√天堂8资源在线| 精品美女视频 | 在线一区电影| 亚洲国产专区| 91精品精品| 99热国内精品| av亚洲在线观看| 国产在线成人| 欧美不卡高清| 在线一区视频| 狠狠干综合网| 国产二区精品| 欧美综合二区| 日韩欧美中文字幕电影| 麻豆国产91在线播放| 国产探花在线精品| 日本亚洲视频| 色综合视频一区二区三区日韩 | 亚洲精品成a人ⅴ香蕉片| 亚洲午夜精品久久久久久app| 欧美另类中文字幕 | 亚洲欧洲美洲国产香蕉| 91久久视频| 欧美专区一区二区三区| 蜜桃视频免费观看一区| 日韩中文一区二区| 人人精品久久| 国产精品一站二站| 日韩一区二区三免费高清在线观看 | 亚洲三级观看| 免费日本视频一区| 日韩亚洲精品在线观看| 久久精品99国产精品| 国产调教精品| 国产日本亚洲| 国产一区丝袜| 欧美日韩精品免费观看视完整| 久久电影tv| 国产午夜精品一区二区三区欧美| 精品一区毛片| 男人的天堂久久精品| 91成人精品在线| 麻豆中文一区二区| 日韩中文视频| 人人精品人人爱| 亚洲性视频在线| 久久a爱视频| 日韩欧美三级| 亚洲欧美视频| 男女男精品网站| 国产黄色精品| 国产aⅴ精品一区二区四区| 红杏一区二区三区| 亚洲a在线视频| 亚洲天堂资源| 噜噜噜躁狠狠躁狠狠精品视频| 日韩1区2区3区| 国产精品二区不卡| 日韩免费小视频| 蜜桃久久久久久久| 国产欧美高清| 91精品推荐| 国产美女亚洲精品7777| 日韩欧美二区| 日韩一区二区三区高清在线观看| 日韩成人a**站| 蜜桃久久久久久| 97精品国产一区二区三区| 日韩在线a电影| 日本v片在线高清不卡在线观看| 97精品一区二区| 亚洲丝袜啪啪| 91精品久久久久久久久久不卡| 欧美日韩精品一区二区三区视频| 久久久久久久久久久妇女| 国产人成精品一区二区三| 免费视频国产一区| 久久91视频| 日韩精选在线| 亚洲综合二区| 亚洲黄色免费av| 日韩不卡在线观看日韩不卡视频| 欧美sss在线视频| 国产午夜精品一区在线观看| 97欧美在线视频| 国产亚洲欧美日韩在线观看一区二区 | 91精品一区国产高清在线gif| 日韩欧乱色一区二区三区在线| 国产91久久精品一区二区| 老牛国内精品亚洲成av人片| 亚洲尤物在线| 亚洲高清二区| 欧美好骚综合网| 日韩中文av| 亚洲免费在线| 精品国产91| 欧美国产免费| 久久精品97| 日本国产亚洲| 亚洲久草在线| 蜜臀a∨国产成人精品| 激情综合自拍| 婷婷综合六月| 亚洲国产福利| 欧美经典一区| 国产欧美91| 日韩av网站在线观看| 一区二区三区国产在线| 99成人在线| 图片区亚洲欧美小说区| 丰满少妇一区| 久久女人天堂| 欧美激情日韩| 日韩av午夜在线观看| 国产精品社区| 在线视频精品| 黄色亚洲大片免费在线观看| 精品视频91| 久久精品免费看| 精品国产午夜| 欧美91在线|欧美| 美女高潮久久久|