Chat App 项目之解析(九)

news2024/11/28 6:42:59

Chat App 项目介绍与解析(一)-CSDN博客文章浏览阅读468次,点赞12次,收藏3次。Chat App 是一个实时聊天应用程序,旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录,还提供了管理员登录功能,以便管理员可以查看和管理聊天记录。本文将详细介绍index.html文件的实现细节,包括代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141330140Chat App 项目之解析(二)-CSDN博客文章浏览阅读496次,点赞10次,收藏16次。在前一篇博客中,我们介绍了 Chat App 的主页index.html。本篇将深入探讨用户注册页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141330781Chat App 项目之解析(三)-CSDN博客文章浏览阅读426次,点赞18次,收藏17次。在前一篇博客中,我们介绍了用户注册页面。本篇将深入探讨用户登录页面login.html,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。login.html。https://blog.csdn.net/qq_45519030/article/details/141331037

Chat App 项目之解析(四)-CSDN博客文章浏览阅读705次,点赞28次,收藏19次。在前一篇博客中,我们详细介绍了用户登录页面login.html。本篇将深入探讨聊天室页面chat.html,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。chat.html。https://blog.csdn.net/qq_45519030/article/details/141331411Chat App 项目之解析(五)-CSDN博客文章浏览阅读890次,点赞25次,收藏7次。在前一篇博客中,我们详细介绍了聊天室页面chat.html。本篇将深入探讨样式表styles.css,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。styles.css。https://blog.csdn.net/qq_45519030/article/details/141331696Chat App 项目之解析(六)-CSDN博客文章浏览阅读274次,点赞18次,收藏14次。在前一篇博客中,我们详细介绍了样式表styles.css。本篇将深入探讨管理员登录页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141331943Chat App 项目之解析(七)-CSDN博客文章浏览阅读842次,点赞16次,收藏9次。在前一篇博客中,我们详细介绍了管理员登录页面。本篇将深入探讨管理员聊天记录页面,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。https://blog.csdn.net/qq_45519030/article/details/141332107Chat App 项目之解析(八)-CSDN博客文章浏览阅读681次,点赞14次,收藏22次。在前一篇博客中,我们详细介绍了管理员聊天记录页面。本篇将深入探讨后端服务server.go,包括其代码解释、实现效果、实现方法以及后续需要实现的功能。用户认证模块:负责用户的注册和登录。WebSocket 通信模块:实现客户端与服务器之间的实时消息传递。数据库模块:存储用户信息和聊天记录。管理员接口:提供管理员查看、删除和过滤聊天记录的功能。用户在线状态管理:实时显示用户的在线状态。消息加密与解密:确保消息在传输过程中的安全性。用户权限控制:实现更复杂的用户权限管理。用户注册。https://blog.csdn.net/qq_45519030/article/details/141332531

我们接着上一篇后端内容接着讲!

用户在线状态管理

用户在线状态管理模块负责实时显示用户的在线状态。服务器维护一个在线用户列表,当用户连接或断开 WebSocket 连接时,更新该列表并通知所有客户端。

功能介绍
  • 在线状态管理:实时显示用户的在线状态。

示例代码:在线状态管理
package main

import (
    "encoding/json"
    "log"
    "net/http"
    "sync"

    "github.com/gorilla/websocket"
)

func onlineStatusHandler(w http.ResponseWriter, r *http.Request) {
    if err != nil {
        log.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    if email == "" {
        http.Error(w, "Invalid email", http.StatusBadRequest)
        return
    }

    onlineUsersMutex.Lock()

    defer func() {
        onlineUsersMutex.Lock()
    }()

    for {
        if err != nil {
            log.Println("Error reading message:", err)
            break
        }
    }
}

func broadcastOnlineUsers() {
    for {
        onlineUsersMutex.Lock()
        onlineUsersMutex.Unlock()

        msg, err := json.Marshal(users)
        if err != nil {
            log.Println("Error marshalling online users:", err)
            continue
        }

        for conn := range connections {
            if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
                log.Println("Error writing message:", err)
                continue
            }
        }

    }
}

代码解释

  • onlineStatusHandler 函数处理用户在线状态的 WebSocket 连接。
  • 使用 onlineUsersMutex 互斥锁管理在线用户列表,确保并发安全。
  • broadcastOnlineUsers 函数定期广播在线用户列表给所有连接的客户端。

消息加密与解密

消息加密与解密模块确保消息在传输过程中的安全性。服务器在发送消息前对其进行加密,客户端在接收消息后对其进行解密。

功能介绍
  • 消息加密:在发送消息前对其进行加密。
  • 消息解密:在接收消息后对其进行解密。

示例代码:消息加密与解密
package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/base64"
    "io"
    "log"
)

func encrypt(text []byte) (string, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }

    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return "", err
    }

    stream := cipher.NewCFBEncrypter(block, iv)

    return base64.URLEncoding.EncodeToString(ciphertext), nil
}

func decrypt(cryptoText string) ([]byte, error) {
    ciphertext, err := base64.URLEncoding.DecodeString(cryptoText)
    if err != nil {
        return nil, err
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }

    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]

    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return ciphertext, nil
}

func messageHandlerWithEncryption(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Error upgrading connection:", err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("Error reading message:", err)
            connMutex.Lock()
            connMutex.Unlock()
            break
        }

        if err := json.Unmarshal(message, &msg); err != nil {
            log.Println("Error unmarshalling message:", err)
            continue
        }

        encryptedMessage, err := encrypt([]byte(msg.Message))
        if err != nil {
            log.Println("Error encrypting message:", err)
            continue
        }

        msg.Message = encryptedMessage

        log.Printf("Received message from %s: %s\n", msg.Email, msg.Message)

        if err != nil {
            log.Println("Error inserting message:", err)
        }

        for conn := range connections {
            if err := conn.WriteJSON(msg); err != nil {
                log.Println("Error writing message:", err)
                continue
            }
        }
    }
}

代码解释

  • encrypt 函数对消息进行加密。
  • decrypt 函数对消息进行解密。
  • messageHandlerWithEncryption 函数处理 WebSocket 消息,并在发送消息前对其进行加密。

用户权限控制

用户权限控制模块实现更复杂的用户权限管理。服务器根据用户的角色和权限,限制其访问某些功能和数据。

功能介绍
  • 权限管理:根据用户的角色和权限,限制其访问某些功能和数据。

示例代码:用户权限控制
package main

import (
    "log"
    "net/http"
)

func adminOnly(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        email := r.Header.Get("Email")

        var role string
        if err != nil {
            log.Println("Error querying user role:", err)
            return
        }

        if role != "admin" {
            http.Error(w, "Forbidden", http.StatusForbidden)
            return
        }

        h(w, r)
    }
}

func userOnly(h http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        email := r.Header.Get("Email")
        if email == "" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }

        if err != nil {
            log.Println("Error querying user role:", err)
            http.Error(w, "Internal server error", http.StatusInternalServerError)
            return
        }

        if role != "user" && role != "admin" {
            http.Error(w, "Forbidden", http.StatusForbidden)
            return
        }

        h(w, r)
    }
}

func main() {
    log.Println("Starting server on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

代码解释

  • adminOnly 函数是一个中间件,用于限制只有管理员角色的用户才能访问特定的处理函数。
  • userOnly 函数是一个中间件,用于限制只有用户或管理员角色的用户才能访问特定的处理函数。
  • 在 main 函数中,使用这些中间件来保护特定的API端点。

安全性考虑

在实现上述功能的同时,我们也考虑了一些安全性问题:

  1. 密码存储:用户的密码在存储时应该进行加密处理,避免明文存储带来的安全风险。
  2. 输入验证:在处理用户输入时,应该进行严格的验证,防止SQL注入和XSS攻击。
  3. 访问控制:管理员接口应该进行严格的访问控制,确保只有授权的管理员才能访问。
  4. 消息加密:在消息传输过程中进行加密,确保消息的安全性。
  5. 用户权限控制:根据用户的角色和权限,限制其访问某些功能和数据。

总结

本文深入探讨了如何使用 Go 语言构建一个功能完备的实时聊天系统,该系统不仅支持用户注册、登录,还提供了管理员接口用于管理聊天记录。

此外,我们还扩展了系统的功能,包括用户在线状态管理、消息加密和解密、以及更复杂的用户权限控制。

希望本项目能为对实时通信系统感兴趣的读者提供一些参考和帮助。

完整详细代码请访问以下链接(godev/ChatAPP):

GitHub - alexjjzc/godev: go language developmentgo language development. Contribute to alexjjzc/godev development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/alexjjzc/godev

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

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

相关文章

ArcGIS小技巧:编辑一个面的边界时,如何让相邻面同步修改

欢迎关注同名微信公众号,更多文章推送: 在ArcGIS中手动编辑2个相邻面的共同边界时,通常需要2个面都跟着修改: 一般做法是用【整形要素工具】,但是【整形要素工具】不能选择多个要素执行,所以需要执行2次&am…

GoFly框架登录Token使用

token是验证请求接口用户身份的标识,框架建议开发者在识别用户身份时使用token尽量不要明文传用户标识数据。 一、生成用户登录token 通过routeuse.GenerateToken生成登录token,方法返回生成的token字符串和err错误提示,其中routeuse.UserC…

删除或丢失的移动硬盘数据如何恢复?三种办法助你找回宝贵资料

在数字化时代,移动硬盘已成为我们存储重要数据不可或缺的工具。然而,数据丢失或误删除的情况时有发生,让人倍感焦虑。别担心,本文将为你详细介绍如何恢复删除或丢失的移动硬盘数据,帮助你找回那些宝贵的资料。 一、检…

太仓自闭症谱系(ASD)儿童

在我国,自闭症谱系(ASD)儿童被称为“星星的孩子”,他们犹如夜空中闪烁的星星,孤独而遥远。为了关爱这些特殊的孩子,让他们更好地融入社会,太仓市星星雨特殊儿童康复中心应运而生。这家康复中心致…

【YashanDB认证】YCA学习记录

第一章:YashanDB基础介绍 国产化数据库的发展及未来 崖山数据库系统:YashanDB是【深圳计算科学研究院】完全自主研发设计的新型数据库系统,经过工信部下述机构权威检测,内核代码自主率100%。 YashanDB 核心交易型数据库 企业级…

拆卸并简单分析一个充电宝线路板

原因 一个很久的充电宝,电量完全不能满足使用,拆解下来的保护板分析 结构图解 除了下图,还有一些外围电路 工作原理图解 电池保护芯片XB8606A(停产) VM连接的是充电口的负极,而这个芯片通过控制电池…

IEEEtran类模板中算法Algorithm的写法

1、注释掉默认的引用 % \usepackage{algorithmic} % \usepackage{algorithm}2、在\begin{document}之前加以下内容 \usepackage[ruled,norelsize,vlined,linesnumbered]{algorithm2e} \makeatletter \newcommand{\removelatexerror}{\let\latexerror\gobble} \makeatother3、…

2 kubeflow系统架构 学习笔记

1 Kubeflow生态系统 2 生态系统说明 2.1. Hardware(硬件层) 提供计算资源的底层硬件支持。GPU(如NVIDIA)通常用于加速机器学习和深度学习的计算任务,而Intel和AMD则可能提供CPU计算资源。 2.2. Infrastructure&…

线程池【详解】

线程池 1、 线程池概念 如果有非常多的任务需要非常多的线程来完成,每个线程的工作时间不长,就需要创建很多线程,工作完又立即销毁[线程频繁创建和销毁线程] 频繁创建和销毁线程非常消耗性能,那么线程池,就是可以创建一些线程,放在"池子"中,用的时候去池子取一个线…

RJ45网口链接器和PCB板结构再生产上需要注意那些方面

华强盛电子导读:工程技术前面199中间2643后面0038 关于网口和PCB板板结合插件会出现几个问题 ...网口的尺寸结构,PCB板板的孔位小,这里强调,建议孔位开大一点,便于生产插件方便。 在插件生产过程中,RJ45网…

免费批量自动校正图片、PDF文档方向工具

功能介绍:批量自动识别图片和PDF文档页面方向,并校正为正确阅读方向(非倾斜纠偏) jpg校正演示 #修复exif信息导致的jpg图像显示和实际旋转不一致问题 #增加图像DPI选项,优先原图或者固定DPI,但这些只会对产生旋转的图…

qss的border-image和background-image和background-coloor和color

如果你的图片和按钮一样大,譬如40X40,那么两者都可以。 如果你的图片和按钮不一样大,用border-image会填充或者拉伸缩放以自适应按钮。 background-image则不会。 所以一般情况下,使用border-image会更合适。 border-image&…

深度学习入门:卷积神经网络 | CNN概述,图像基础知识,卷积层,池化层(超详解!!!)

目录 🍔 前言 🍔 图像基础知识 1. 像素和通道的理解 2. 小节 🍔 卷积层 1. 卷积计算 2. Padding 3. Stride 4. 多通道卷积计算 5. 多卷积核卷积计算 6. 特征图大小 7. PyTorch 卷积层 API 7. 小节 🍔 池化层 1. 池…

openlayers+vite+vue3加载离线地图并实现初始化(一)

前景提示:本文主要讲解使用vite工具构建的项目,利用openlayers实现离线地图的主要一些功能,包括初始化地图、打点、画线、弹窗等等,这些后续有时间会持续为大家更新,本文主要阐述如何实现其首要功能离线地图的初始化。…

linux系统删除文件后,可用率没变,磁盘还是满的

linux系统磁盘清理排查 前言排查解决 前言 某天更新服务时,发现服务怎么也上传不了,原因是磁盘空间不足,这很简单,直接找到大文件删除rm -rf 即可,但是我删除之后,df -h 发现磁盘空间一点变化都没有&#…

Unity XR Interaction Toolkit 通过两个手柄控制物体放大缩小

1:给物体添加 XR General Grab Transformer 脚本 2:XR Grab Interactable 的 select mode 选择 Multiple

基于Burp爆破验证码

目录 基于Burp爆破验证码 一、验证码识别 二、爆破 1、访问登录请求并发送至intruder模块 2、访问验证码url并将截取的请求发送至captcha-killer模块 3、intruder模块设置 3、爆破结果 4、使用burp完成上述操作,存在以下问题: 基于Burp爆破验证码…

Transformer系列-6丨LRNet和Stand-Alone Self-Attention网络解析

0. 前言 本次主要分享之前看的两篇将自注意力机制self-attention应用在视觉感知任务的文章,分别为LRNet和Stand-alone self-attention。为了深化读者的理解,本文提供了较为详细的中文注释的代码。 首先了解一下这两篇文章的背景,其都是在Vi…

【CSP:202309-1】坐标变换(其一)(Java)

题目链接 202309-1 坐标变换(其一) 题目描述 求解思路 直接暴力模拟即可。 实现代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n, m;n in.nextInt();m in.…

Python 实现自定义异常

在Python编程中,异常处理是保证程序健壮性的重要机制。Python提供了一些内置的异常类,如ValueError、TypeError、IndexError等,开发者可以直接使用这些类来捕获和处理程序运行中出现的各种错误。然而,某些场景下,内置的…