Vue学习:存入会话缓存

sessionStorage

①存数据:
window.sessionStorage.setItem('token','success')

token :键值
success:值
需要存入对象时:
var obj = {“a”: 1,“b”: 2};
obj = JSON.stringify(obj); //转化为JSON字符串
sessionStorageStorage.setItem(“token”, obj);//返回{“a”:1,“b”:2}
localStorage.setItem是一样的

②取数据
window.sessionStorage.getItem("token")

将存储的json字符串转换成json对象
let obj=JSON.parse(localStorage.getItem(“token”));

③清除
window.sessionStorage.clear()

路由导航守卫

防止没有登录状态直接访问其他页面

// 挂载路由守卫
router.beforeEach(((to, from, next) => {
    //to 将要访问的路径
    //from 来自哪个路径
    //next是一个函数
    //next() 放行  next('/login') 强制跳转
    if (to.path === '/login') return next()
    const token = window.sessionStorage.getItem("token")
    if(!token) return next('/login')
    next()
}))
### SpringBoot、WebSocket、MySQL 和 Vue 实现 1v1 多个会话的聊天系统的架构设计 #### 架构概述 为了实现支持1v1多个会话的聊天系统,可以采用分层架构设计。以下是各层的主要职责: - **Presentation Layer (前端)** 使用 Vue.js 开发用户交互界面,负责显示聊天窗口、处理用户输入以及通过 WebSocket 进行通信。 - **Application Layer (应用层)** 负责协调 Presentation 层和 Domain 层之间的交互,定义用例控制器来管理具体的业务逻辑。 - **Domain Layer (领域层)** 定义核心业务逻辑,包括领域模型(如 User、Message)、仓储接口以及领域服务。 - **Infrastructure Layer (基础设施层)** 提供底层技术支持,例如 MySQL 数据库访问、Redis 缓存管理和 WebSocket 的具体实现。 --- #### 技术选型与模块划分 ##### 前端部分 (Vue.js) 前端使用 Vue.js 来构建动态的聊天界面,主要包括以下几个模块: - `ChatComponent.vue`:用于渲染聊天窗口。 - `WebSocketService.js`:封装 WebSocket 的连接、消息发送和接收逻辑。 - `Store.js`:使用 Vuex 或 Pinia 管理全局状态,存储当前用户的会话列表和未读消息数。 示例代码如下: ```javascript // WebSocketService.js export default class WebSocketService { constructor() { this.socket = null; this.connect(); } connect() { const userId = localStorage.getItem('userId'); this.socket = new WebSocket(`ws://localhost:8080/ws/${userId}`); this.socket.onmessage = (event) => { console.log("Received message:", event.data); // 更新Vuex中的消息状态 }; this.socket.onerror = (error) => { console.error("WebSocket error:", error); }; } sendMessage(message) { if (this.socket.readyState === WebSocket.OPEN) { this.socket.send(JSON.stringify(message)); } } } ``` ##### 后端部分 (Spring Boot + WebSocket) 后端使用 Spring Boot 实现 WebSocket 功能,并结合 Redis 和 MySQL 存储在线状态和历史消息。 ###### WebSocket 配置 创建一个 WebSocket 配置类,启用 STOMP 协议并配置消息代理。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); // 订阅路径前缀 config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws/{userId}") .setAllowedOrigins("*") // 设置允许跨域请求 .withSockJS(); // 支持 SockJS 兼容性 } } ``` ###### 消息处理器 编写一个 Controller 类来处理客户端发送的消息,并将其广播给目标用户。 ```java import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; @Controller public class ChatController { @MessageMapping("/sendMessage") @SendTo("/topic/messages/{receiverId}") // 将消息推送给特定用户 public Message handleMessage(Message message) { System.out.println("Handling chat message:" + message.getContent()); return message; } } class Message { private String senderId; private String receiverId; private String content; // Getters and Setters... } ``` ##### 数据库存储 (MySQL) 数据库主要用于持久化历史消息和用户信息。表结构设计如下: - **users 表** ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password_hash VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` - **messages 表** ```sql CREATE TABLE messages ( id BIGINT AUTO_INCREMENT PRIMARY KEY, sender_id INT NOT NULL, receiver_id INT NOT NULL, content TEXT NOT NULL, sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_read BOOLEAN DEFAULT FALSE, FOREIGN KEY (sender_id) REFERENCES users(id), FOREIGN KEY (receiver_id) REFERENCES users(id) ); ``` 当用户上线时,可以从数据库中加载未读消息;当新消息到达时,更新 `is_read` 字段以标记为已读。 --- #### 关键点解析 1. **在线状态管理** 使用 Redis 存储用户的在线状态,以便快速判断某个用户是否处于活动状态[^3]。如果目标用户不在线,则将消息暂存在 MySQL 中,待其重新上线后再推送。 2. **消息可靠性保障** 对于重要的消息(如文件传输或敏感通知),可以通过 ACK 机制确认消息已被成功接收[^4]。 3. **性能优化** - 引入心跳检测机制,定期检查 WebSocket 连接的有效性。 - 结合 Nginx 反向代理负载均衡多个 WebSocket 节点,提升并发能力[^3]。 --- ### 示例运行流程 假设 Alice 和 Bob 正在进行聊天: 1. Alice 登录系统后,前端通过 `/ws/Alice` 地址建立 WebSocket 连接。 2. 当 Alice 发送一条消息给 Bob 时,前端调用 `sendMessage` 方法并将消息内容传至服务器。 3. 服务器收到消息后,检查 Bob 是否在线(通过 Redis 查询)。如果在线,则立即将消息推送到 Bob 的订阅地址 `/topic/messages/Bob`;否则,将消息存入 MySQL 并等待 Bob 上线后再推送。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值