C++GO语言微服务之用户信息处理②

目录

01 03-获取用户信息-上

02 04-获取用户信息-下

03 05-更新用户名实现

01 06-中间件简介和中间件类型

02 07-中间件测试和模型分析

03 08-中间件测试案例和小结

04 09-项目使用中间件


 

01 03-获取用户信息-上

## Cookie操作

### 设置Cookie

```go
func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) 
name: 名称。 相当于 key
value:内容。
maxAge:最大生命周期。
     = 0 : 表示没指定该属性。
     < 0 :表示删除。 ---- // 删除Cookie 的操作, 可以使用 该属性实现。
     > 0 :指定生命周期。 单位:s
path:路径。—— 通常传""
domain:域名。 IP地址。
secure:设置是否安全保护。true:不能在 地址栏前,点击查看。 可以使用 F12 查看。
                       false:能在 地址栏前,点击查看。
httpOnly:是否只针对http协议。
```

02 04-获取用户信息-下

测试案例:

```go
package main

import "github.com/gin-gonic/gin"

func main()  {
    router := gin.Default()

    router.GET("/test", func(context *gin.Context) {
        // 设置 Cookie
        //context.SetCookie("mytest", "chuanzhi", 60*60, "", "", true, true)
        //context.SetCookie("mytest", "chuanzhi", 60*60, "", "", false, true)
        context.SetCookie("mytest", "chuanzhi", 0, "", "", false, true)
        context.Writer.WriteString("测试 Cookie ...")
    })

    router.Run(":9999")
}
```

03 05-更新用户名实现

### 获取Cookie

```go
// 获取Cookie
cookieVal, _ := context.Cookie("mytest")

fmt.Println("获取的Cookie 为:", cookieVal)
```



## Session 操作

- gin 框架, 默认不支持Session功能。要想在 gin 中使用 Session,需要添加插件!
  
- gin 框架中的 “插件”  —— 中间件 —— gin MiddleWare
  
- 去 github 搜索,gin Session 可以得到:https://github.com/gin-contrib/sessions

- 安装 Session 插件。

- ```
    $ go get github.com/gin-contrib/sessions
    ```



### 设置session

- 容器的初始化:

    ```go
    func NewStore(size int, network, address, password string, keyPairs ...[]byte) (Store, error)
    size:容器大小。
    network:协议
    address:IP:port
    password:使用redis做容器使用的密码。 没有特殊设定,传 “”
    []byte(“secret”): 加密密钥!
    ```

- 使用容器:

    ```go
    func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {}
    router.Use(sessions.Sessions("mysession", store))
    ```

测试案例:

01 06-中间件简介和中间件类型

```go
package main

import (
    "github.com/gin-gonic/gin"

    "github.com/gin-contrib/sessions/redis"
    "github.com/gin-contrib/sessions"
)

func main()  {
    router := gin.Default()

    // 初始化容器.
    store, _ := redis.NewStore(10, "tcp", "192.168.6.108:6379", "", []byte("bj38"))

    // 使用容器
    router.Use(sessions.Sessions("mysession", store))

    router.GET("/test", func(context *gin.Context) {
        // 调用session, 设置session数据
        s := sessions.Default(context)
        // 设置session
        s.Set("itcast", "itheima")
        // 修改session时, 需要Save函数配合.否则不生效
        s.Save()

        context.Writer.WriteString("测试 Session ...")
    })

    router.Run(":9999")
}
```

02 07-中间件测试和模型分析

### 获取session

```go
// 建议:不要修改 session属性,使用默认属性。
v := s.Get("itcast")
fmt.Println("获取 Session:", v.(string))
```



# 实现用户登录

1. 浏览器 访问 : 192.168.6.108:8080/home   点击登录按钮。  跳“登录页面”。 输手机号、输密码,登录

2. 在 Name的 General  和  Request Payload 中获取到 路由 和 方法以及数据信息。

3. web/main.go 添加:

    ```go
    r1.POST("/sessions", controller.PostLogin)    // 注意 “s”
    ```

4. web/controller/user.go 增加函数

    ```go
    // 处理登录业务
    func PostLogin(ctx *gin.Context) {
    }
    ```

5. 实现 PostLogin 函数

    1. 获取数据。 因为数据来自  Request Payload , 所以:需要通过“Bind”来获取输入数据

        ```go
        var loginData struct {
            Mobile   string `json:"mobile"`
            PassWord string `json:"password"`
        }
        ctx.Bind(&loginData)
        ```

    2. web/model/modelFunc.go  创建函数, 处理登录业务,根据手机号/密码 获取用户名

        ```go
        // 处理登录业务,根据手机号/密码 获取用户名
        func Login(mobile, pwd string) (string, error) {
        
            var user User
        
            // 对参数 pwd 做md5 hash
            m5 := md5.New()
            m5.Write([]byte(pwd))
            pwd_hash := hex.EncodeToString(m5.Sum(nil))
        
            err := GlobalConn.Where("mobile = ?", mobile).Select("name").
                Where("password_hash = ?", pwd_hash).Find(&user).Error
        
            return user.Name, err
        }
        ```

6. 获取数据库数据,查询是否和输入数据匹配    

    ```go
    userName, err  := model.Login(loginData.Mobile, loginData.PassWord)
    resp := make(map[string]interface{})
    if err == nil {
        // 登录成功
        resp["errno"] = utils.RECODE_OK
        resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
    
        // 将 登录状态保存到 session 中 
    
    } else {
        // 登录失败.
        resp["errno"] = utils.RECODE_LOGINERR
        resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
    }
    ```

    

7. 在 web/main.go 中 , 初始化容器, 使用容器

    ```go
    // 初始化容器
    store, _ := redis.NewStore(10, "tcp", "192.168.6.108:6379", "", []byte("bj38"))    
    
    // 使用容器
    router.Use(sessions.Sessions("mysession", store))
    ```

    

8. 完整实现 ,处理登录业务  PostLogin() 函数

    ```go
    // 处理登录业务
    func PostLogin(ctx *gin.Context) {
        // 获取前端数据
        var loginData struct {
            Mobile   string `json:"mobile"`
            PassWord string `json:"password"`
        }
        ctx.Bind(&loginData)
    
        resp := make(map[string]interface{})
    
        //获取 数据库数据, 查询是否和数据的数据匹配
        userName, err := model.Login(loginData.Mobile, loginData.PassWord)
        if err == nil {
            // 登录成功!
            resp["errno"] = utils.RECODE_OK
            resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
    
            // 将 登录状态, 保存到Session中
            s := sessions.Default(ctx)      // 初始化session
            s.Set("userName", userName)   // 将用户名设置到session中.
            s.Save()
    
        } else {
            // 登录失败!
            resp["errno"] = utils.RECODE_LOGINERR
            resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
        }
    
        ctx.JSON(http.StatusOK, resp)
    }
    
    ```

03 08-中间件测试案例和小结

9. 测试:
    1. go  run   web/main.go 即可! 其他的不用启动!
    2. 浏览器, 192.168.6.108:8080/home  ——> 登录 ——> 输入用户名、密码 ——> 登录!
    3. 看不到变化,是因为:我们写的第一个 Session 相关函数 GetSession(),里面 直接发送的假数据,并没有真正获取 Session。现在我们有真正Session了。
    4. 请大家尝试修改实现 GetSession() !最终能在浏览器中看到 登录变化。

04 09-项目使用中间件

 

 

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

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

相关文章

QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版)

QMK键盘固件开发全解析:QMK 固件开发的最新架构和规范(2025最新版) 📚 前言概述 QMK(Quantum Mechanical Keyboard)作为目前开源键盘固件领域的"扛把子",凭借其强大的功能和活跃的社区支持,已经成为众多DIY键盘爱好者的首选开发框架。无论是入门级玩家还是资…

极狐GitLab 容器镜像仓库功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 极狐GitLab 容器镜像库 (BASIC ALL) 您可以使用集成的容器镜像库&#xff0c;来存储每个极狐GitLab 项目的容器镜像。 要为您…

Umi+React+Xrender+Hsf项目开发总结

一、菜单路由配置 1.umirc.ts 中的路由配置 .umirc.ts 文件是 UmiJS 框架中的一个配置文件&#xff0c;用于配置应用的全局设置&#xff0c;包括但不限于路由、插件、样式等。 import { defineConfig } from umi; import config from ./def/config;export default defineCon…

【运维】基于Python打造分布式系统日志聚合与分析利器

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在分布式系统中,日志数据分散在多个节点,管理和分析变得复杂。本文详细介绍如何基于Python开发一个日志聚合与分析工具,结合Logstash和F…

Python实战:海量获取京东商品信息

在数据驱动的商业时代&#xff0c;数据就是最宝贵的资源。对于电商从业者、市场分析师而言&#xff0c;从京东这类大型电商平台获取商品信息&#xff0c;能够为市场调研、竞品分析、销售策略制定提供重要依据。今天&#xff0c;就来分享如何用Python实现京东商品信息的海量获取…

聊一聊常见的超时问题:timeout

大家好&#xff0c;我是G探险者&#xff01; 在日常开发中&#xff0c;“超时&#xff08;Timeout&#xff09;”类错误是开发者们经常遇到的问题。无论是调用第三方服务、访问数据库&#xff0c;还是并发任务处理&#xff0c;都可能因超时而导致请求失败或系统异常。 本文将系…

创建型模式:工厂方法(Factory Method)模式

一、简介 工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。在 C# 中,工厂方法模式提供了一种更灵活的对象创建方式,将对象的创建和使用分离,提高了代码的可维护性和…

外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建

外网访问内网海康威视监控视频的方案&#xff1a;WebRTC Coturn 需求背景 在仓库中有海康威视的监控摄像头&#xff0c;内网中是可以直接访问到监控摄像的画面&#xff0c;由于项目的需求&#xff0c;需要在外网中也能看到监控画面。 实现这个功能的意义在于远程操控设备的…

Redis 8.0正式发布,再次开源为哪般?

Redis 8.0 已经于 2025 年 5 月 1 日正式发布&#xff0c;除了一些新功能和性能改进之外&#xff0c;一个非常重要的改变就是新增了开源的 AGPLv3 协议支持&#xff0c;再次回归开源社区。 为什么说再次呢&#xff1f;这个需要从 2024 年 3 月份 Redis 7.4 说起&#xff0c;因为…

382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接

之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…

大模型系列(五)--- GPT3: Language Models are Few-Shot Learners

论文链接&#xff1a; Language Models are Few-Shot Learners 点评&#xff1a; GPT3把参数规模扩大到1750亿&#xff0c;且在少样本场景下性能优异。对于所有任务&#xff0c;GPT-3均未进行任何梯度更新或微调&#xff0c;仅通过纯文本交互形式接收任务描述和少量示例。然而&…

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解

这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…

Django rest_framework 信号机制生成并使用token

1、在setting.py 中增加设置 DEFAULT_AUTHENTICATION_CLASSES:[rest_framework.authentication.BasicAuthentication,#基本的用户名密码验证rest_framework.authentication.SessionAuthentication,rest_framework.authentication.TokenAuthentication,# token 认证], INSTALLE…

SQL Server To Paimon Demo by Flink standalone cluster mode

需求&#xff1a;使用 Flink CDC 测试 SQL Server 连接 Paimon 操作&#xff1a;启动 Flink standalone cluster 后&#xff0c;接着启动 Flink SQL Client&#xff0c;则通过 Flink SQL Client 提交 insert & select job 到该 8081 cluster Flink SQL Client 执行案例 -…

MySQL 从入门到精通(四):备份与恢复实战——从逻辑到物理,增量备份全解析

数据是企业的核心资产&#xff0c;而数据库作为数据存储的 “心脏”&#xff0c;其备份与恢复策略直接关系到业务的连续性。本文将结合 MySQL 的日志体系与备份工具&#xff0c;深入讲解逻辑备份、物理备份、增量备份的实战操作&#xff0c;帮助你构建可靠的数据库保护方案。 目…

鸿蒙编译boost整合linux跨平台应用

openharmony deveco 4.1支持armeabi-v7a deveco 5.0后不支持arm32位系统 boost编译 使用deveco的写cmake集成boost boost使用1.88的最新版本&#xff0c;带cmake工具链 https://github.com/boostorg/boost.git boost的源码都在sub_module中 deveco 4.1的版本sdk最高到9&am…

机器视觉的平板电脑屏幕组件覆膜应用

在现代智能制造业中&#xff0c;平板电脑屏幕组件覆膜工序是确保产品外观和功能完整性的重要环节。随着技术的进步&#xff0c;传统的覆膜方式已经无法满足高速度、高精度的生产需求。而MasterAlign视觉系统的出现&#xff0c;将传统覆膜工艺转变为智能化、自动化的生产流程。在…

android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述 使用 pthread 获取线程名字&#xff0c; 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…

【前端基础】6、CSS的文本属性(text相关)

目录内容 text-decoration&#xff1a;设置文本装饰线text-transform&#xff1a;文本中文字的大小写转换text-indent&#xff1a;首行缩进text-align&#xff1a;设置文本对齐方式 一、text-decoration&#xff1a;设置文本装饰线 常见值&#xff1a; None&#xff1a;没有…

【Ansible】模块详解

一、ansible概述 1.1 ansible介绍 Ansible 是一个基于 Python 开发的配置管理和应用部署工具&#xff0c;近年来在自动化管理领域表现突出。它集成了许多传统运维工具的优点&#xff0c;几乎可以实现 Pubbet 和 Saltstack 所具备的功能。 1.2 ansible能做什么 批量处理。An…