用Cookie+HttpOnly实现双Token认证与滑动刷新
# 用 Cookie+HttpOnly 实现双 Token 认证与滑动刷新 # 为什么需要双 Token 方案? 传统单 Token 方案面临两大痛点: 安全风险 - Token 泄露等于永久入侵 体验问题 - 频繁重新登录影响用户体验 双 Token 方案完美解决: 🛡️ Access Token(短时效):15-30 分钟有效期,降低被盗风险 🔄 Refresh Token(长时效):7-30 天有效期,静默刷新会话 # 技术选型 组件 方案 优势说明 Access Token JWT + localStorage 方便前端使用,自动过期 Refresh...
more...a small SocketIo+WebRTC Demo
# 基于 Socket.IO 和 WebRTC 的实时语音聊天室 (Demo 版本) # 功能亮点 🎙️ 实时语音通话(P2P 直连) 💬 文字消息群聊(房间隔离) 🚪 动态房间管理 🌐 自动 NAT 穿透(STUN 服务) # 技术栈 技术 用途 Socket.IO 信令服务器 / 消息中转 WebRTC 音视频 P2P 通信 React 前端界面框架 Node.js 后端服务 # 快速开始 # 环境准备 # 前端依赖npm install socket.io-client react react-dom# 后端依赖npm install express...
more...自定义hook
# 什么是自定义 hook? 自定义 Hooks 是一个以 use 开头的 JavaScript 函数,它内部可以调用其他的 Hooks,如 useState 、 useEffect 等。 # 为什么使用自定义 Hooks? 代码复用: 当多个组件需要相同的逻辑时,可以通过自定义 Hooks 将这些逻辑封装起来,避免重复编写相同的代码。 提高代码清晰度:通过将特定功能的逻辑集中在一个地方,可以使组件更加简洁,易于理解和维护。 # 如何创建自定义 Hooks? 创建自定义 Hooks 非常简单,只需编写一个函数,并根据需要在其内部调用其他 Hooks。 例如,如果你想创建一个计数器...
more...React-router应用
React Router 是一个用于在 React 应用中实现动态路由的强大库。它使得单页应用(SPA)能够拥有多个视图,并且可以根据 URL 的变化来显示不同的内容,而无需重新加载整个页面。 安装库: npm install react-router-dom # 核心概念 BrowserRouter BrowserRouter 使用 HTML5 提供的 History API 来保持 UI 和 URL 同步。 HashRouter 则使用 URL 的 hash 部分(即 # 后面的内容),适用于不支持 HTML5 History API 的旧浏览器。 Routes 和...
more...在Redux中与后端通信
# 准备 这里使用 json-server 模拟后端数据, json-server 是一个基于 JSON 的 HTTP 服务器,用于快速创建 RESTful API。 在 reducer 中,我们使用 redux-thunk 来处理异步操作, redux-thunk 是一个中间件,它允许我们返回一个函数而不是一个对象,并在函数中可以进行异步操作。 # 示例 在 noteReducer 中,我们创建 initializenotes 和 createNoteAction 两个函数,分别用于初始化笔记列表和创建新的笔记。都是异步操作,所以使用了 redux-thunk 。调用时直接调用...
more...使用Redux进行状态管理
# 安装 Redux npm install redux# 使状态完全从组件中分离开 动作对应用状态的影响是用一个 reducer 来定义的 const counterReducer = (state = 0, action) => { switch (action.type) { case 'INCREMENT': return state + 1 case 'DECREMENT': return state - 1 case 'ZERO': return 0 default: // if none...
more...条件渲染下hook重置and父组件调用子组件的函数
# 条件渲染下子组件内部的 hook 重置 当父组件使用条件渲染(例如通过一个状态或属性决定是否渲染某个子组件)时,如果条件从 true 变为 false ,然后又变回 true ,这个过程确实会导致 React 重新创建该子组件实例。这意味着子组件内部的 useState (以及其他钩子的状态)将会被重置,因为每次条件为真且子组件被重新挂载时,都会初始化一个新的状态。 例子 function ParentComponent() { const [showChild, setShowChild] = useState(true); return (...
more...