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();
  }
});

小结

相关推荐
慧都小项4 分钟前
从 Figma 到 Qt:Qtitan 能减少哪些界面还原工作?
前端·qt·嵌入式·figma·图形界面·工业界面·qtitan
YWL7 分钟前
OpenLayers导出功能:地图截图+GeoJSON导出完整方案,从Canvas合并到PDF生成
前端·vue·openlayers
苦瓜小生15 分钟前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
mayaairi25 分钟前
Vue2 实战进阶:表单数据收集、指令系统与自定义指令全解析
前端·javascript·vue.js
计算机魔术师34 分钟前
实测GPT-6 Astra后,我发现过去十年的专业门槛正在失效
前端
虎头金猫38 分钟前
Pic Smaller 本地部署:压缩图片、转换格式,再搭建自己的 Web 工具
运维·前端·开源·aigc·ai编程·ai写作
hunterandroid38 分钟前
Android ANR 排查实战:从线上告警到主线程卡点定位
android·前端
图扑软件1 小时前
下篇・换墨|主题/多语言/移动端,一套组件全覆盖
前端·javascript·ui·性能优化·数据可视化
程序员老赵1 小时前
Docker 部署 TeX Live:轻松搭建 LaTeX 论文排版编译平台
前端·docker·latex
计算机毕设定制辅导-无忧学长1 小时前
《基于Spring Boot传承之光非遗陶瓷烧造产品交易平台的设计与实现》
java·vue.js·spring boot·后端·毕业设计