vue3 +vite项目页面防f12,防打开控制台

概要

vue3 +vite项目页面防f12,防打开控制台

技术细节

第一步 禁用浏览器的默认行为;在main.js里面app.mount之后引入

javascript 复制代码
(function(){

   // 在应用挂载后,禁用右键菜单

window.addEventListener('contextmenu', event => event.preventDefault()); // 阻止右键菜单



window.addEventListener('keydown', function(event) {

    // 阻止F12打开控制台

    if (event.key === 'F12') {

        event.preventDefault();

    }

    // 阻止Ctrl + Shift + I打开控制台

    if (event.ctrlKey && event.shiftKey && event.key === 'I') {

        event.preventDefault();

    }

    // 阻止Ctrl + Shift + J打开控制台

    if (event.ctrlKey && event.shiftKey && event.key === 'J') {

        event.preventDefault();

    }

    // 阻止Ctrl + Shift + C打开控制台

    if (event.ctrlKey && event.shiftKey && event.key === 'C') {

        event.preventDefault();

    }

    // 阻止Cmd + Opt + I (Mac)打开控制台

    if (event.metaKey && event.altKey && event.key === 'I') {

        event.preventDefault();

    }

});



})()

第二步借鉴文档原文地址找不到了

创建detectDevTools.js

javascript 复制代码
export function detectDevTools() {
  // 方法1: 检测 window.devtools 或 __VUE_DEVTOOLS_GLOBAL_HOOK__
  if (window.devtools || (window.__VUE_DEVTOOLS_GLOBAL_HOOK__ && window.__VUE_DEVTOOLS_GLOBAL_HOOK__.emit)) {
    return true;
  }

  // 方法2: 利用 console.log 的行为差异
  // 在某些浏览器中,当控制台打开时,console.log 的参数引用会被保留
  let devtoolsOpen = false;
  const threshold = 100; // 阈值,单位为毫秒

  const start = performance.now();
  // @ts-ignore
  console.log('%c', () => {
    devtoolsOpen = true;
  });
  const end = performance.now();

  if (end - start > threshold) {
    devtoolsOpen = true;
  }

  // 清空刚才的 log,避免污染控制台
  console.clear();

  return devtoolsOpen;
}

// 持续检测的函数
export function monitorDevTools(options = {}) {
  const {
    interval = 1000, // 检测间隔
    onOpen = () => {
      var callbacks = [],
        timeLimit = 50,
        open = false;
      setInterval(loop, 1);
      return {
        addListener: function (fn) {
          callbacks.push(fn);
        },
        cancleListenr: function (fn) {
          callbacks = callbacks.filter(function (v) {
            return v !== fn;
          });
        }
      }
      function loop() {
        var startTime = new Date();
        debugger;
        if (new Date() - startTime > timeLimit) {
          if (!open) {
            callbacks.forEach(function (fn) {
              fn.call(null);
            });
          }
          open = true;
          window.stop();
          window.location.reload();
        } else {
          open = false;
        }
      }
    }, // 检测到打开时的回调
    onClose = () => { } // 检测到关闭时的回调
  } = options;

  let isOpen = false;

  const check = () => {
    const currentOpen = detectDevTools();
    if (currentOpen && !isOpen) {
      isOpen = true;
      onOpen();
    } else if (!currentOpen && isOpen) {
      isOpen = false;
      onClose();
    }
  };

  // 立即执行一次
  check();

  // 设置定时器,持续检测
  const intervalId = setInterval(check, interval);

  // 返回一个函数,用于停止检测
  return () => clearInterval(intervalId);
}

在app.vue里面使用

javascript 复制代码
import { monitorDevTools } from './detectDevTools.js';

onMounted(() => {
    // 开始监控开发者工具
    stopMonitoring = monitorDevTools({});
   
});


onUnmounted(() => {
  // 组件卸载时,停止监控
  if (stopMonitoring) {
    stopMonitoring();
  }
});

小结

相关推荐
alamhubb几秒前
vue也支持声明式UI了,向移动端kotlin,swift看齐,抛弃html,pug升级版,进来看看新语法吧
前端·javascript·前端框架
毕设源码-邱学长1 分钟前
【开题答辩全过程】以 基于web的心理测评系统的设计与实现为例,包含答辩的问题和答案
前端
北辰alk2 分钟前
从零构建Vue项目的完全指南:手把手打造现代化前端工程
vue.js
Composure3 分钟前
在 UmiJS + Vue 3 项目中实现 WebP 图片自动转换和优化
前端·javascript
我是苹果,不是香蕉6 分钟前
【python调用edge driver报错】
前端·edge
Neptune112 分钟前
js入门指南之Promise:从''承诺''到理解,告别回调地域
前端·javascript
YaeZed17 分钟前
Vue3-watchEffect
前端·vue.js
boombb18 分钟前
H5 图片路径不统一,导致线上部分图片无法按预期展示(assetPrefix 与 basePath 行为不一致)
前端
栀秋66619 分钟前
深入浅出AI流式输出:从原理到Vue实战实现
前端·vue.js·前端框架
柳成荫19 分钟前
Chromium 渲染机制
前端