Vue 事件修饰符详解

Vue 事件修饰符详解

事件修饰符是 Vue 中处理 DOM 事件细节的强大工具。下面我将通过一个交互式示例全面解析各种事件修饰符的用法和原理。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue 事件修饰符详解</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;line-height: 1.6;color: #2c3e50;background: linear-gradient(135deg, #f5f7fa 0%, #e4edf5 100%);min-height: 100vh;padding: 20px;}.container {max-width: 1200px;margin: 0 auto;}header {text-align: center;padding: 30px 0;margin-bottom: 30px;}h1 {font-size: 2.8rem;margin-bottom: 15px;color: #34495e;}.subtitle {color: #7f8c8d;font-size: 1.3rem;max-width: 800px;margin: 0 auto;}.card {background: white;border-radius: 12px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);padding: 30px;margin-bottom: 30px;}.card-header {margin-bottom: 20px;padding-bottom: 15px;border-bottom: 2px solid #f0f4f8;display: flex;align-items: center;gap: 15px;}.card-header h2 {font-size: 1.8rem;color: #2c3e50;}.modifier-grid {display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));gap: 25px;margin: 30px 0;}.modifier-card {background: #f8fafc;border-radius: 10px;padding: 25px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);transition: transform 0.3s, box-shadow 0.3s;}.modifier-card:hover {transform: translateY(-5px);box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);}.modifier-card h3 {color: #2c3e50;margin-bottom: 15px;display: flex;align-items: center;gap: 10px;}.modifier-card h3 .icon {background: #42b983;color: white;width: 30px;height: 30px;border-radius: 50%;display: flex;align-items: center;justify-content: center;font-size: 18px;}.code-block {background: #2d2d2d;color: #f8f8f2;padding: 15px;border-radius: 8px;font-family: 'Fira Code', monospace;font-size: 14px;margin: 15px 0;overflow-x: auto;}.demo-area {background: white;padding: 25px;border-radius: 10px;margin-top: 20px;border: 1px solid #e2e8f0;}.demo-container {display: flex;flex-wrap: wrap;gap: 20px;}.demo-box {flex: 1;min-width: 300px;padding: 20px;border-radius: 8px;background: #f8fafc;}.event-target {padding: 30px;background: #e3f2fd;border-radius: 8px;margin: 15px 0;position: relative;cursor: pointer;}.event-target .inner {padding: 20px;background: #bbdefb;border-radius: 6px;}.event-target .inner .core {padding: 15px;background: #90caf9;border-radius: 4px;}.form-demo {background: #e8f5e9;padding: 20px;border-radius: 8px;margin-top: 20px;}button {background: #42b983;color: white;border: none;padding: 12px 20px;border-radius: 6px;cursor: pointer;font-size: 16px;font-weight: 500;transition: background 0.3s;display: inline-block;margin: 5px;}button:hover {background: #3aa776;}.log-area {background: #1e1e1e;color: #d4d4d4;padding: 20px;border-radius: 8px;margin-top: 20px;font-family: 'Fira Code', monospace;max-height: 300px;overflow-y: auto;font-size: 14px;}.log-entry {margin-bottom: 8px;padding-bottom: 8px;border-bottom: 1px solid #333;}.log-time {color: #6a9955;}.keyboard-demo {display: flex;gap: 15px;flex-wrap: wrap;margin: 20px 0;}.key {background: #3498db;color: white;padding: 12px 18px;border-radius: 6px;cursor: pointer;text-align: center;min-width: 80px;}.mouse-buttons {display: flex;gap: 15px;margin: 20px 0;}.mouse-btn {background: #9b59b6;color: white;padding: 15px;border-radius: 8px;cursor: pointer;text-align: center;flex: 1;}.summary-table {width: 100%;border-collapse: collapse;margin: 25px 0;background: white;border-radius: 8px;overflow: hidden;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);}.summary-table th, .summary-table td {border: 1px solid #e2e8f0;padding: 16px;text-align: left;}.summary-table th {background-color: #f8fafc;font-weight: 600;color: #2c3e50;}.summary-table tr:nth-child(even) {background-color: #f8fafc;}.highlight {background-color: #fff9c4;padding: 2px 4px;border-radius: 3px;color: #333;}@media (max-width: 768px) {.demo-container {flex-direction: column;}h1 {font-size: 2.2rem;}}</style>
</head>
<body><div class="container"><header><h1>Vue 事件修饰符详解</h1><p class="subtitle">全面解析 Vue 事件修饰符的原理、用法及最佳实践</p></header><div class="card"><div class="card-header"><h2>事件修饰符基础</h2></div><p>事件修饰符是 Vue 为 v-on 指令提供的特殊后缀,用于处理 DOM 事件细节:</p><div class="modifier-grid"><!-- .stop 修饰符 --><div class="modifier-card"><h3><span class="icon"></span> .stop</h3><p>阻止事件冒泡(相当于 event.stopPropagation())</p><div class="code-block">&lt;div @click.stop="handleClick"&gt;...&lt;/div&gt;</div><p class="demo-hint">点击内部元素不会触发外部元素的事件</p></div><!-- .prevent 修饰符 --><div class="modifier-card"><h3><span class="icon">🚫</span> .prevent</h3><p>阻止默认行为(相当于 event.preventDefault())</p><div class="code-block">&lt;form @submit.prevent="onSubmit"&gt;...&lt;/form&gt;</div><p class="demo-hint">阻止表单提交、链接跳转等默认行为</p></div><!-- .capture 修饰符 --><div class="modifier-card"><h3><span class="icon">🔍</span> .capture</h3><p>使用事件捕获模式(从外到内处理事件)</p><div class="code-block">&lt;div @click.capture="handleCapture"&gt;...&lt;/div&gt;</div><p class="demo-hint">先处理外部元素,再处理内部元素</p></div><!-- .self 修饰符 --><div class="modifier-card"><h3><span class="icon">👤</span> .self</h3><p>只当事件是从元素自身触发时触发</p><div class="code-block">&lt;div @click.self="handleSelf"&gt;...&lt;/div&gt;</div><p class="demo-hint">忽略内部元素冒泡上来的事件</p></div><!-- .once 修饰符 --><div class="modifier-card"><h3><span class="icon">1️⃣</span> .once</h3><p>事件只触发一次</p><div class="code-block">&lt;button @click.once="handleOnce"&gt;...&lt;/button&gt;</div><p class="demo-hint">第一次点击后自动移除事件监听</p></div><!-- .passive 修饰符 --><div class="modifier-card"><h3><span class="icon"></span> .passive</h3><p>提升滚动性能(不阻止默认行为)</p><div class="code-block">&lt;div @scroll.passive="onScroll"&gt;...&lt;/div&gt;</div><p class="demo-hint">特别针对移动端滚动优化</p></div></div><div class="demo-area"><h3>事件修饰符演示</h3><div class="demo-container"><div class="demo-box"><h4>事件冒泡测试</h4><div class="event-target" @click="logEvent('outer')">外层区域<div class="inner" @click="logEvent('inner')">中间区域<div class="core" @click="logEvent('core')">核心区域</div></div></div><div class="keyboard-demo"><button @click="clearLogs">清除日志</button><button @click="addStopModifier('core')">核心添加.stop</button><button @click="addSelfModifier('inner')">中间添加.self</button></div></div><div class="demo-box"><h4>默认行为测试</h4><div class="form-demo"><form @submit="logEvent('表单提交')"><p><input type="text" placeholder="输入内容" style="width:100%; padding:10px; margin:10px 0;"></p><button type="submit">普通提交</button><button type="submit" @click.prevent="logEvent('阻止提交')">阻止提交</button><button type="submit" @click.prevent.once="logEvent('只提交一次')">只提交一次</button></form><div style="margin-top: 20px;"><a href="https://vuejs.org" @click="logEvent('普通链接')">普通链接</a><a href="https://vuejs.org" @click.prevent="logEvent('阻止跳转')">阻止跳转链接</a></div></div></div></div><div class="log-area"><div v-for="(log, index) in eventLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>按键修饰符</h2></div><p>Vue 提供按键修饰符来处理键盘事件:</p><div class="demo-area"><div class="keyboard-demo"><div class="key" @keydown.enter="handleKey('Enter')">Enter</div><div class="key" @keydown.esc="handleKey('Esc')">Esc</div><div class="key" @keydown.space="handleKey('Space')">Space</div><div class="key" @keydown.up="handleKey('↑')"></div><div class="key" @keydown.down="handleKey('↓')"></div><div class="key" @keydown.left="handleKey('←')"></div><div class="key" @keydown.right="handleKey('→')"></div><div class="key" @keydown.delete="handleKey('Delete')">Delete</div><div class="key" @keydown.tab="handleKey('Tab')">Tab</div></div><div class="keyboard-demo"><div class="key" @keydown.ctrl.exact="handleKey('Ctrl')">Ctrl</div><div class="key" @keydown.alt.exact="handleKey('Alt')">Alt</div><div class="key" @keydown.shift.exact="handleKey('Shift')">Shift</div><div class="key" @keydown.meta.exact="handleKey('Meta')">Meta</div></div><div class="keyboard-demo"><div class="key" @keydown.ctrl.enter="handleKey('Ctrl+Enter')">Ctrl+Enter</div><div class="key" @keydown.alt.space="handleKey('Alt+Space')">Alt+Space</div><div class="key" @keydown.shift.up="handleKey('Shift+↑')">Shift+↑</div></div><input type="text" placeholder="在此输入内容测试按键事件" @keydown="logKeyEvent"style="width:100%; padding:12px; border-radius:6px; border:1px solid #ddd; margin:15px 0;"><div class="log-area"><div v-for="(log, index) in keyLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>鼠标修饰符</h2></div><div class="demo-area"><div class="mouse-buttons"><div class="mouse-btn" @click="handleMouse('左键')">左键点击</div><div class="mouse-btn" @click.right="handleMouse('右键')">右键点击</div><div class="mouse-btn" @click.middle="handleMouse('中键')">中键点击</div><div class="mouse-btn" @click.left="handleMouse('左键')">左键点击</div></div><div class="mouse-buttons"><div class="mouse-btn" @click.ctrl="handleMouse('Ctrl+点击')">Ctrl+点击</div><div class="mouse-btn" @click.shift="handleMouse('Shift+点击')">Shift+点击</div><div class="mouse-btn" @click.alt="handleMouse('Alt+点击')">Alt+点击</div><div class="mouse-btn" @click.exact="handleMouse('精确点击')">精确点击</div></div><div class="log-area"><div v-for="(log, index) in mouseLog" :key="index" class="log-entry"><span class="log-time">{{ log.time }}</span> - {{ log.message }}</div></div></div></div><div class="card"><div class="card-header"><h2>事件修饰符总结</h2></div><div class="summary-table"><table><thead><tr><th>修饰符</th><th>作用</th><th>原生 JS 等效操作</th><th>使用场景</th></tr></thead><tbody><tr><td><code>.stop</code></td><td>阻止事件冒泡</td><td><code>event.stopPropagation()</code></td><td>阻止内部事件触发外部事件</td></tr><tr><td><code>.prevent</code></td><td>阻止默认行为</td><td><code>event.preventDefault()</code></td><td>阻止表单提交、链接跳转</td></tr><tr><td><code>.capture</code></td><td>使用捕获模式</td><td>在事件捕获阶段处理</td><td>需要先处理父级再处理子级</td></tr><tr><td><code>.self</code></td><td>仅自身触发时处理</td><td>检查 <code>event.target</code></td><td>忽略子元素冒泡事件</td></tr><tr><td><code>.once</code></td><td>只触发一次</td><td>触发后移除事件监听</td><td>一次性操作(如首次点击)</td></tr><tr><td><code>.passive</code></td><td>提升滚动性能</td><td><code>{ passive: true }</code></td><td>移动端滚动优化</td></tr><tr><td><code>.{keyCode}</code></td><td>按键事件</td><td><code>event.keyCode</code></td><td>处理特定按键事件</td></tr><tr><td><code>.native</code></td><td>监听组件根元素</td><td>原生事件绑定</td><td>在组件上监听原生事件</td></tr></tbody></table></div><div class="demo-area"><h3>最佳实践</h3><ul><li>使用修饰符代替直接在方法中操作 DOM 事件</li><li>注意修饰符的顺序:<code>@click.prevent.self</code><code>@click.self.prevent</code> 不同</li><li>移动端优先使用 <code>.passive</code> 提升滚动性能</li><li>使用 <code>.exact</code> 修饰符精确控制系统修饰符组合</li><li>自定义按键别名:<code>Vue.config.keyCodes.f1 = 112</code></li></ul><div class="code-block">// 修饰符串联示例&lt;a @click.stop.prevent="handleLink"&gt;链接&lt;/a&gt;// 精确控制系统修饰符&lt;button @click.ctrl.exact="ctrlClick"&gt;Ctrl+点击&lt;/button&gt;// 自定义按键别名Vue.config.keyCodes = {f1: 112,mediaPlayPause: 179}</div></div></div></div><script>new Vue({el: '.container',data: {eventLog: [],keyLog: [],mouseLog: [],stopModifier: '',selfModifier: ''},methods: {logEvent(source) {const time = new Date().toLocaleTimeString();this.eventLog.unshift({time,message: `事件来源: ${source}`});if (this.eventLog.length > 20) {this.eventLog.pop();}},logKeyEvent(event) {const time = new Date().toLocaleTimeString();this.keyLog.unshift({time,message: `按键: ${event.key} (代码: ${event.code})`});if (this.keyLog.length > 15) {this.keyLog.pop();}},handleKey(key) {const time = new Date().toLocaleTimeString();this.keyLog.unshift({time,message: `检测到按键: ${key}`});},handleMouse(button) {const time = new Date().toLocaleTimeString();this.mouseLog.unshift({time,message: `鼠标操作: ${button}`});},clearLogs() {this.eventLog = [];this.keyLog = [];this.mouseLog = [];},addStopModifier(element) {this.stopModifier = element;this.logEvent(`${element}元素添加了.stop修饰符`);},addSelfModifier(element) {this.selfModifier = element;this.logEvent(`${element}元素添加了.self修饰符`);},// 模拟修饰符效果handleCoreClick(event) {if (this.stopModifier === 'core') {event.stopPropagation();}this.logEvent('核心区域');},handleInnerClick(event) {if (this.selfModifier === 'inner') {if (event.target !== event.currentTarget) return;}this.logEvent('中间区域');}}});</script>
</body>
</html>

Vue 事件修饰符详解

核心事件修饰符

  1. .stop - 阻止事件冒泡

    • 等效于 event.stopPropagation()停止事件冒泡
    • 使用场景:阻止内部事件触发外部事件
  2. .prevent - 阻止默认行为

    • 等效于 event.preventDefault()阻止事件的默认行为。
    • 使用场景:阻止表单提交、链接跳转等
  3. .capture - 使用事件捕获模式

    • 事件从外到内处理(默认是冒泡模式,从内到外)
      • 添加事件监听器包括两种不同的方式:
        • 一种是从内到外添加(是事件冒泡模式)
        • 一种是从外到内添加(是事件捕获模式)
    • 使用场景:需要先处理父级再处理子级的事件
  4. .self - 仅当事件源是元素自身时触发

    • 忽略子元素冒泡上来的事件
    • 使用场景:只在点击元素自身时触发,忽略内部元素事件
  5. .once - 事件只触发一次

    • 触发后自动移除事件监听
    • 使用场景:一次性操作(如首次点击)
  6. .passive - 提升滚动性能(passive意为顺从、不抵抗。直接继续(立即)执行事件的默认行为)

    • 告诉浏览器不阻止默认行为
    • 使用场景:移动端滚动优化
    • 注意:.passive和.prevent修饰符是对立的。两者不可以共存(如果一起用,就会报错)。
      • .prevent :阻止事件的默认行为
      • .passive:解除阻止事件的默认行为

注意:在Vue当中,使劲按修饰符可以多个联合使用,例如:
@click.self.stop:先执行.self.再执行.stop

按键修饰符

Vue 提供了常见按键的别名:

  • .enter
  • .tab
  • .delete (捕获 “删除” 和 “退格” 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

系统修饰键:

  • .ctrl
  • .alt
  • .shift
  • .meta (Windows 键或 Command 键)

鼠标修饰符

  • .left - 左键点击
  • .right - 右键点击
  • .middle - 中键点击

修饰符使用技巧

  1. 修饰符串联

    <!-- 先停止冒泡,再阻止默认行为 -->
    <a @click.stop.prevent="doThat"></a>
    
  2. 精确修饰符

    <!-- 有且只有 Ctrl 被按下时才触发 -->
    <button @click.ctrl.exact="onCtrlClick">Ctrl+Click</button><!-- 没有任何系统修饰符被按下时才触发 -->
    <button @click.exact="onClick">Click</button>
    
  3. 自定义按键别名

    // 全局配置
    Vue.config.keyCodes = {f1: 112,mediaPlayPause: 179
    }// 使用
    <input @keyup.f1="help" @keyup.mediaPlayPause="playPause">
    

最佳实践

  1. 使用修饰符替代在方法中操作 DOM 事件
  2. 注意修饰符的顺序(从左到右处理)
  3. 移动端优先使用 .passive 提升滚动性能
  4. 使用 .exact 精确控制系统修饰键组合
  5. 避免过度使用 .once,确保用户理解操作是一次性的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初探Qt信号与槽机制

3.3 按键响应 - 初识信号与槽 3.3.1 信号与槽基本介绍 提出疑问&#xff0c;界面上已经有按键了&#xff0c;怎么操作才能让用户按下按键后有操作上的反应呢&#xff1f; 在 Qt 中&#xff0c; 信号和槽机制 是一种非常强大的事件通信机制。这是一个重要的概念&#xff0…

Android音视频流媒体基础总结

流媒体开发中&#xff0c;流媒体系统的实现从数据采集、编码封装、传输分发、接收解码播放都有哪些技术和实现&#xff0c;流媒体和本地音视频又有哪些差异&#xff1f; 影像系统开发&#xff0c;流媒体方向和普通的多媒体影像系统开发有一定差异。 相同点在于图像多媒体处理…

疫菌QBD案例

本文是《A-VAX: Applying Quality by Design to Vaccines》第七个研究的R语言解决方案。 使用带两个中心点的二水平析因设计。运行10次实验。结果是分辨度为III的设计。 A <- c(25,25,15,15,15,25,25,20,15,20) B <- c(12,8,8,12,8,12,8,10,12,10) C <- c(35,15,15…

Linux部署elasticsearch 单机版

Linux部署elasticsearch 1、下载安装包 Elasticsearch 7.8.0 | Elastic 2、安装步骤 2.1、上传安装包到服务器opt目录 2.2、解压 #目录创建/opt/module cd /opt mkdir module tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module mv elasticsearch-7.8.0 …

IDEA高效快捷键指南

1. 编辑类快捷键 编辑快捷键是最常用的一类&#xff0c;可以帮助我们快速操作代码&#xff1a; 快捷键 功能描述 Mac Windows 热度 psvm Tab 生成 main 方法 psvm Tab psvm Tab ⭐⭐⭐⭐⭐ sout Tab 生成 System.out.println() 输出语句 sout Tab sout Tab…

【论文写作参考文献地址】

参考文献地址 论文的各种参考文献地址国家哲学社会科学文献中心国家科技图书文献中心 论文的各种参考文献地址 国家哲学社会科学文献中心 资源免费!!! 整体配色就是红色&#xff0c;主页轮播有些实时新闻。 博主个人感受&#xff0c;对于计算机类的收录不是特别的充足 国家科…

华为OD机考-货币单位换算-字符串(JAVA 2025B卷)

纯暴力解法 import java.util.*; public class ExchangeMoney {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while(scanner.hasNextLine()){int count Integer.parseInt(scanner.nextLine());List<String> strings new ArrayLi…

系统学习·PHP语言

由于之前没系统的学习PHP语言&#xff0c;都是在做题时遇到不会的才去查&#xff0c;后来发现这样的效率非常低&#xff0c;审代码别人一眼扫出漏洞&#xff0c;而我还需要去查一下这行代码的意思&#xff0c;那个函数的作用&#xff0c;查当然要查&#xff0c;但连简单的语法都…

leetcode2-两数相加

leetcode 2 思路 链表特性利用&#xff1a;由于数字按逆序存储&#xff0c;个位在链表头部&#xff0c;因此可以直接从前往后遍历链表进行逐位相加 比如题目中的 2->4->3 和 5->6->4 其实可以直接按位从第一位开始往后相加&#xff0c;就得到啦708 这样比把数字…

Java的Arrays.sort():排序算法与优化分析

文章目录 前言一、基本类型数组&#xff1a;双轴快速排序关键优化策略 二、对象数组&#xff1a;TimSort关键优化策略 三、性能对比总结总结 前言 在Java中&#xff0c;Arrays.sort()是开发者最常用的排序方法之一。但你是否思考过它的底层实现&#xff1f;本文将基于OpenJDK …

软件测试质量的“防”与“治”

引言: 想象一下,你正在建造一座摩天大楼。你是愿意在打地基时就严格检查材料规格和设计图纸(主动防患),还是等到大楼封顶后才开始拿着锤子敲敲打打找裂缝(被动补救)?软件世界亦是如此!今天,我们就来聊聊软件测试这个“质量守护神”的两大战略思维和三大实战招式,让你…

TDengine 如何从 2.x 迁移到 3.0

本节讲述如何通过 Explorer 界面创建数据迁移任务&#xff0c;从旧版 TDengine2 迁移数据到 TDengine 3.0 集群。 功能概述 taosX 通过 SQL 查询源集群数据&#xff0c;并把查询结果写入到目标数据库。具体实现上&#xff0c;taosX 以一个子表的一个时间段的数据作为查询的基…

免下载苹果 IPA 文件重签名工具:快速更换应用名称和 BID的教程

在iOS设备的使用和开发过程中&#xff0c;我们有时需要对IPA文件进行重签名&#xff0c;以便更换应用名称、Bundle ID&#xff08;软件包标识符&#xff09;或其他相关信息。这一过程通常需要使用到特定的工具&#xff0c;然而&#xff0c;市面上的一些工具可能需要下载和安装&…

Python全栈开发:前后端分离项目架构详解

文章目录 技术栈选择后端技术栈前端技术栈 项目整体结构详细目录结构说明后端架构&#xff08;backend/&#xff09;1. 应用核心&#xff08;app/&#xff09;2. 数据层&#xff08;models/&#xff09;3. API模式层&#xff08;schemas/&#xff09;4. API路由层&#xff08;a…

微信小程序使用图片实现红包雨功能

微信小程序红包雨功能实现&#xff1a;从组件封装到页面调用的完整实践 先看示例截图&#xff1a; 一、背景与技术选型 在微信小程序营销活动中&#xff0c;红包雨是一种极具吸引力的互动形式。实现红包雨效果主要有 Canvas 和图片两种方案&#xff1a; &#xff08;1&…

Python day31

浙大疏锦行 数据拆分的基本框架&#xff0c;拆分后让项目结构更加清晰

Chapter10-XXE

文章目录 1.XXE介绍1.1 XXE产生的原因1.1.1 什么是XML&#xff1f;1.1.2 什么是XML实体1.1.3 什么是文档类型定义&#xff08;document type definition&#xff09;1.1.4 什么是XML自定义实体1.1.5 什么是XML外部实体 2.XXE攻击类型2.1 利用XXE检索文件2.2 利用XXE执行SSRF攻击…

Ribbon负载均衡实战指南:7种策略选择与生产避坑

引言&#xff1a;客户端负载均衡的不可替代性 当面试官问你&#xff1a;“Ribbon 和 Nginx 有什么区别&#xff1f;”——Ribbon 是进程内 LB 这一句话值 20K 月薪。 作为微服务调用的核心枢纽&#xff0c;Ribbon 通过 ​​本地服务清单动态分发请求​​&#xff0c;避免中心化…

Webpack:现代前端构建工具的核心解析

Hi&#xff0c;我是布兰妮甜 &#xff01;在前端工程化日益重要的今天&#xff0c;Webpack作为主流构建工具&#xff0c;已成为现代前端开发的核心基础设施。它通过模块化打包机制&#xff0c;优雅地解决了复杂应用中的资源管理问题&#xff0c;使开发者能够专注于业务逻辑的实…

Elasticsearch索引wildcard查询

在之前的文章 Elasticsearch索引的字段映射 中介绍过关于索引中字段查询的多种方式。可以根据需要通过设置索引字段的type以及fields来实现分词,精确匹配等多种方式的查询。 elasticSearch中检索核心类型大概可以分为:精准匹配检索(Term-level queries)和基于分词的全文匹…