前端防御性編程

關于防御性編程

  • 你是否遇到過,接口請求失敗或者返回數據錯誤,導致系統白屏
  • 或者前端自身寫的代碼存在一些缺陷,導致整個系統不夠健壯,從而導致系統白屏

常見的問題與防范

最常見的問題

  • 訪問了null或者undefined的屬性
null.a
Uncaught TypeError: Cannot read properties of null (reading 'a')
  • 防御方案:使用可選鏈?.,可選鏈會在遇到空值時返回undefined
const obj = {}
console.log(obj?.a?.b)

前端接口層面的錯誤機制捕獲

使用單例模式,將所有的axios請求都用一個函數封裝一層。統一可以在這個函數中catch捕獲接口調用時候的未知錯誤

單例模式保證一個類只有一個實例,并提供一個全局訪問點來獲取它。

request(config: AxiosRequestConfig) {return new Promise((resolve, reject) => {this.instance.request(config).then(res => {resolve(res)}).catch(err => {reject(err)})})}

前端復雜異步場景導致的錯誤

在前端項目中,直接修改導出的對象會導致狀態不可控,尤其是在復雜異步場景中,你很難判斷數據在某個時刻的值到底是什么、是被誰改的。通過封裝 setter 函數,可以顯式地記錄每次修改的 key 和 value,從而實現「單向數據流」的狀態管理方式。這種方式不僅提升了可讀性與可維護性,還更利于 debug 和擴展,是一種更加穩健的防御性編程策略。

問題背景

// test.js
export const obj = {a: 1,b: 2
}// 使用 obj
import { obj } from './test.js'
obj.a = 3

這段代碼的問題是

  • obj是一個導出的全局對象
  • 任何文件都能直接修改它的屬性
  • 多個模塊、異步任務可能都在讀寫它
  • 導致你無法跟蹤它的狀態是怎么變的,在哪變的,什么時候變得

解決方案:

// test.js
export const obj = {a: 1,b: 2
}export function setObj(key, value) {console.log(key, value)obj[key] = value
}
  • 修改行為統一管理,數據更可控
  • 日志追蹤更方便

擴展
這體現了單向數據流的應用

所有的數據改動都走一個方向,一個入口,不允許亂改

這也是為什么像React、Vue、Redux等框架都鼓勵 “不可變數據 + action” 的方式來改變狀態

前端專注前端

在涉及登錄態、權限控制、敏感信息等安全相關場景中,前端應遵循職責分離的設計理念,盡量避免直接處理或解析敏感數據,僅負責數據的安全轉發和展示控制。鑒權邏輯應統一由后端完成,前端通過接口響應結果進行視圖判斷,從而降低安全風險,提升系統的可維護性與穩定性

頁面做到可降級

對于一些剛上新的業務,或者有存在風險的業務模塊,或者會調取不受信任的接口,例如第三方的接口,這個時候就要做一層降級處理,例如接口調用失敗后,剔除對應模塊的展示,讓用戶無感知的使用

巧用loading和disabled

  • 在用戶觸發操作(比如點擊按鈕、提交表單、發起請求)后,及時給按鈕或控件加上 loading 狀態或 disabled 狀態。
  • 確保不讓用戶進行重復操作,防止業務側出現 bug

為什么這樣做

  1. 防止重復提交或者點擊
  2. 明確交互狀態
  3. 減輕后端壓力

慎用innerHTML

  • innerHTML 是直接把字符串插入 DOM 的方法;

  • 如果插入的字符串中包含 script、<img οnerrοr=…、a href=“javascript:…” 等惡意代碼,瀏覽器就會執行它;

  • 這些代碼一旦被執行,可能導致 XSS 攻擊。

什么是XSS攻擊?

  • XSS(Cross-Site Scripting)跨站腳本攻擊,是指黑客在頁面中注入惡意腳本代碼,從而獲取用戶信息、劫持登錄態、跳轉釣魚頁面等。

比如:

innerHTML = '<img src="x" onerror="alert(document.cookie)">'

用戶打開這個頁面時就會彈出自己的 cookie,一旦被攻擊者獲取,可能會導致賬戶被盜、信息泄露等嚴重后果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76677.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[數據結構]排序 --2

目錄 8、快速排序 8.1、Hoare版 8.2、挖坑法 8.3、前后指針法 9、快速排序優化 9.1、三數取中法 9.2、采用插入排序 10、快速排序非遞歸 11、歸并排序 12、歸并排序非遞歸 13、排序類算法總結 14、計數排序 15、其他排序 15.1、基數排序 15.2、桶排序 8、快速排…

虎躍辦公AI:重構智能辦公的「模型交響樂團」

虎躍辦公AI&#xff1a;重構智能辦公的「模型交響樂團」 ——當全球40大模型在辦公場景中奏響協奏曲 在某科創園區的會議室里&#xff0c;市場總監李薇正用AI生成產品發布會方案&#xff0c;設計團隊同步調校著AI渲染的3D主視覺&#xff0c;法務AI自動掃描著合同風險條款——這…

JdbcTemplate基本使用

JdbcTemplate概述 它是spring框架中提供的一個對象&#xff0c;是對原始繁瑣的JdbcAPI對象的簡單封裝。spring框架為我們提供了很多的操作模板類。例如:操作關系型數據的JdbcTemplate和MbernateTemplate&#xff0c;操作nosql數據庫的RedisTemplate&#xff0c;操作消息隊列的…

vue+leaflet 區域劃分_反向遮罩層

leaflet 區域劃分_遮罩層 geojson在線生成器網址:(https://datav.aliyun.com/portal/school/atlas/area_selector) 點擊前往阿里云geojson生成器 效果圖: 實現下面效果,只需要把addSateLayer函數的調用取消掉就好了. //添加遮罩層代碼function addMask() {var latlngs;var fe…

ESP32開發之ubuntu環境搭建

1. 在Ubuntu官網下載Ubuntu server 20.04版本https://releases.ubuntu.com/20.04.6/ 2. 在vmware下安裝Ubuntu 3. 改Ubuntu靜態IP $ sudo vi /etc/netplan/00-installer-config.yaml# This is the network config written by ‘subiquity’ network: renderer: networkd eth…

HTTP 1.1 比 HTTP1.0 多了什么?(詳盡版)

相較于HTTP 1.0&#xff0c;1.1 版本增加了以上特性&#xff1a; 1. 新增了連接管理即 keepalive&#xff0c;允許持久連接。 定義&#xff1a; Keepalive允許客戶端和服務器在完成一次請求-響應后&#xff0c;保持連接處于打開狀態&#xff0c;以便后續請求復用同一連接&am…

【深度學習】PyTorch實現VGG16模型及網絡層數學原理

一、Demo概述 代碼已附在文末 1.1 代碼功能 ? 實現VGG16網絡結構? 在CIFAR10數據集上訓練分類模型 1.2 環境配置 詳見【深度學習】Windows系統Anaconda CUDA cuDNN Pytorch環境配置 二、各網絡層概念 2.1 卷積層&#xff08;nn.Conv2d&#xff09; nn.Conv2d(in_cha…

解決RecyclerView在調用smoothScrollToPosition后最后一個item底部超出屏幕的問題

要解決RecyclerView在調用smoothScrollToPosition后最后一個item底部超出屏幕的問題&#xff0c;可以使用自定義的LinearSmoothScroller&#xff0c;使其底部對齊屏幕。步驟如下&#xff1a; 創建自定義的SmoothScroller類&#xff1a; 繼承LinearSmoothScroller并重寫getVerti…

k8s親和力和非親和力

在 Kubernetes 中&#xff0c;親和力&#xff08;Affinity&#xff09;和非親和力&#xff08;Anti-Affinity&#xff09;是用于控制 Pod 調度策略的機制&#xff0c;它們可以幫助優化資源利用率、提高應用性能和可用性。以下是親和力和非親和力的詳細解釋&#xff1a; 親和力…

開發一款游戲需要哪些崗位角色參與?

常見分類 1. 游戲策劃&#xff08;Game Designer&#xff09; 核心職責&#xff1a;設計游戲的玩法、規則、內容和整體體驗。 具體工作&#xff1a; 系統設計&#xff1a;設計游戲的戰斗、經濟、成長、社交等核心系統。 數值設計&#xff1a;平衡角色屬性、裝備數值、經濟系…

Asp.NET Core WebApi 創建帶鑒權機制的Api

構建一個包含 JWT&#xff08;JSON Web Token&#xff09;鑒權的 Web API 是一種常見的做法&#xff0c;用于保護 API 端點并驗證用戶身份。以下是一個基于 ASP.NET Core 的完整示例&#xff0c;展示如何實現 JWT 鑒權。 1. 創建 ASP.NET Core Web API 項目 使用 .NET CLI 或 …

Jenkins 發送釘釘消息

這里不介紹 Jenkins 的安裝&#xff0c;可以網上找到很多安裝教程&#xff0c;重點介紹如何集成釘釘消息。 需要提前準備釘釘機器人的 webhook 地址。&#xff08;網上找下&#xff0c;很多教程&#xff09; 下面開始配置釘釘機器人&#xff0c;登錄 Jenkins&#xff0c;下載 …

CentOS中離線安裝DockerCompos并用其部署Rabbitmq(使用離線導入導出docker鏡像方式)

場景 DockerDockerCompose實現部署jenkins,并實現jenkinsfile打包SpringBootVue流水線項目過程詳解、踩坑記錄(附鏡像資源、離線包資源下載)&#xff1a; DockerDockerCompose實現部署jenkins,并實現jenkinsfile打包SpringBootVue流水線項目過程詳解、踩坑記錄(附鏡像資源、離…

stm32week11

stm32學習 八.stm32基礎 2.stm32內核和芯片 F1系統架構&#xff1a;4個主動單元和4個被動單元 AHB是內核高性能總線&#xff0c;APB是外圍總線 總線矩陣將總線和各個主動被動單元連到一起 ICode總線直接連接Flash接口&#xff0c;不需要經過總線矩陣 AHB&#xff1a;72MHz&am…

貪心算法:部分背包問題深度解析

簡介&#xff1a; 該Java代碼基于貪心算法實現了分數背包問題的求解&#xff0c;核心通過單位價值降序排序和分階段裝入策略實現最優解。首先對Product數組執行雙重循環冒泡排序&#xff0c;按wm(價值/重量比)從高到低重新排列物品&#xff1b;隨后分兩階段裝入&#xff1a;循環…

13. Langchain異步處理:提升應用性能的關鍵技巧

引言&#xff1a;從"順序等待"到"并行加速" 2025年某電商平臺引入LangChain異步處理后&#xff0c;大促期間訂單處理能力提升5倍&#xff0c;系統響應延遲降低70%。本文將基于LangChain的異步架構&#xff0c;詳解如何通過并行執行流式處理&#xff0c;讓…

ros2-rviz2控制unity仿真的6關節機械臂,探索從仿真到實際應用的過程

文章目錄 前言&#xff08;Introduction&#xff09;搭建開發環境&#xff08;Setup Development Environment&#xff09;在window中安裝Unity&#xff08;Install Unity in window&#xff09;創建Docker容器&#xff0c;并安裝相關軟件&#xff08;Create Docker containers…

計算機組成原理筆記(十四)——3.4指令類型

一臺計算機的指令系統可以有上百條指令&#xff0c;這些指令按其功能可以分成幾種類型&#xff0c;下面分別介紹。 3.4.1數據傳送類指令 一、核心概念與功能定位 數據傳送類指令是計算機指令系統中最基礎的指令類型&#xff0c;負責在 寄存器、主存、I/O設備 之間高效復制數…

各開源協議一覽

在 GitHub 上&#xff0c;開源項目通常會使用一些常見的開源協議來定義項目的使用、修改和分發規則。以下是目前 GitHub 上最常見的幾種開源協議及其差異和示例說明&#xff1a; TL;DR 協議寬松程度是否強制開源專利保護適用場景MIT最寬松否無希望代碼被廣泛使用Apache 2.0寬松…

51c自動駕駛~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/13793157 #匯聚感知、定位、規劃控制的自動駕駛系統 自動駕駛技術在應用到車輛上之后可以通過提高吞吐量來緩解道路擁堵&#xff0c;通過消除人為錯誤來提高道路安全性&#xff0c;并減輕駕駛員的駕駛負擔&#xff0c;從…