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

news2025/5/16 3:29:01

目录

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.coloradmin.cn/o/2376549.html

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

相关文章

26考研——中央处理器_指令流水线_流水线的冒险与处理 流水线的性能指标 高级流水线技术(5)

408答疑 文章目录 六、指令流水线流水线的冒险与处理结构冒险数据冒险延迟执行相关指令采用转发&#xff08;旁路&#xff09;技术load-use 数据冒险的处理 控制冒险 流水线的性能指标流水线的吞吐率流水线的加速比 高级流水线技术超标量流水线技术超长指令字技术超流水线技术 …

酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论

携程 API 接入指南 API 地址&#xff1a; 调用示例&#xff1a; 美食列表 景点列表 景点详情 酒店详情 参数说明 通用参数说明 请谨慎传递参数&#xff0c;避免不必要的费用扣除。 URL 说明&#xff1a;https://api-gw.cn/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京…

Lora原理及实现浅析

Lora 什么是Lora Lora的原始论文为《LoRA: Low-Rank Adaptation of Large Language Models》&#xff0c;翻译为中文为“大语言模型的低秩自适应”。最初是为了解决大型语言模在进行任务特定微调时消耗大量资源的问题&#xff1b;随后也用在了Diffusion等领域&#xff0c;用于…

【设计模式】- 创建者模式

单例模型 饿汉式 静态方法创建对象 public class Singleton {// 私有构造方法private Singleton(){}private static Singleton instance new Singleton();// 提供一个外界获取的方法public static Singleton getInstance(){return instance;} }静态代码块创建对象 public …

南审计院考研分享会 经验总结

汪学长 – 中科大 计科专硕 初试准备 数学先做真题&#xff0c;模拟题刷的越多分越高&#xff1b;408真题最重要&#xff0c;模拟题辅助&#xff1b;英语只做真题&#xff1b;政治9月份开始背 代码能力在低年级培养的重要性和路径 考研不选择机构原因 因为机构里面学习的框…

牛客练习赛138(首篇万字题解???)

赛时成绩如下&#xff1a; 1. 小s的签到题 小s拿到了一个比赛榜单&#xff0c;他要用最快的速度找到签到题&#xff0c;但是小s脑子还是有点晕&#xff0c;请你帮帮小s&#xff0c;助力他找到签到题。 比赛榜单是一个 2 行 n 列的表格&#xff1a; 第一行是 n 个大写字母&#…

用git下载vcpkg时出现Connection was reset时的处理

用git安装vcpkg时出现Connect was rest&#xff08;如上图&#xff09;。多谢这位网友的博文解决了问题&#xff1a; 通过:http.sslVerify false全局来设置&#xff0c;执行以下命令&#xff1a; git config --global http.sslVerify "false" 原文链接&#xff1a…

leetcode - 滑动窗口问题集

目录 前言 题1 长度最小的子数组&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题2 无重复字符的最长子串&#xff1a; 思考&#xff1a; 参考代码1&#xff1a; 参考代码2&#xff1a; 题3 最大连续1的个数 III&#xff1a; 思考&am…

一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出现打通了AI模型和外部数据库、网页API等资源&#xff0c;成倍提升工作效率。近期火山引擎团队推出了 MCP Server SDK&#xff1a; veimagex-mcp。本文介绍如何在Cherry Studio 和VSCode平台集成 veimagex-mcp。 什么是MCP MCP&#xff08;Model Context Protocol&…

Tomcat与纯 Java Socket 实现远程通信的区别

Servlet 容器​​&#xff08;如 Tomcat&#xff09; 是一个管理 Servlet 生命周期的运行环境&#xff0c;主要功能包括&#xff1a; ​​协议解析​​&#xff1a;自动处理 HTTP 请求/响应的底层协议&#xff08;如报文头解析、状态码生成&#xff09;&#xff1b; ​​线程…

为什么企业建站或独立站选用WordPress

与大多数组织相比&#xff0c;企业业务更需要保持可扩展和可靠的网络存在&#xff0c;以保持竞争力。为此&#xff0c;许多大型企业的 IT 领导者历来寻求昂贵的网络解决方案&#xff0c;这些方案需要签订专有支持合同来保证质量。不过&#xff0c;还有另一种方法。WordPress问世…

镜头内常见的马达类型(私人笔记)

① 螺杆式马达 驱动来源&#xff1a;机身内马达。镜头尾部有一个接收“螺杆”的接口&#xff0c;通过机械传动带动镜头对焦组。缺点&#xff1a;慢、吵、不能用于无机身马达的相机。✅ 典型镜头&#xff1a;尼康 AF、AF-D 系列&#xff1b;美能达老镜头。尼康传统的AF镜头通过…

从代码学习深度学习 - 语义分割和数据集 PyTorch版

文章目录 前言什么是语义分割?图像分割和实例分割Pascal VOC2012 语义分割数据集Pascal VOC2012 语义分割数据集介绍基本信息语义分割部分特点数据格式评价指标应用价值数据集获取使用提示辅助工具代码 (`utils_for_huitu.py`)读取数据预处理数据自定义语义分割数据集类读取数…

4G物联网模块实现废气处理全流程数据可视化监控配置

一、项目背景 随着工业化进程的加速&#xff0c;工业废气的排放对环境造成了严重影响&#xff0c;废气处理厂应运而生。然而&#xff0c;废气处理厂中的设备众多且分散&#xff0c;传统的人工巡检和数据记录方式效率低下&#xff0c;难以及时发现问题。为了实现对废气处理设备…

电商平台如何做好DDoS 攻防战?

一、新型 DDoS 攻击技术演进分析 1.1 电商平台面临的四类攻击范式 graph LR A[DDoS攻击] --> B{网络层} A --> C{应用层} B --> D[CLDAP反射攻击<br>峰值达3.5Tbps] B --> E[QUIC协议洪水攻击] C --> F[API CC攻击<br>精准打击抢购接口] C -->…

【计算机视觉】OpenCV实战项目:Athlete-Pose-Detection 运动员姿态检测系统:基于OpenCV的实时运动分析技术

运动员姿态检测系统&#xff1a;基于OpenCV的实时运动分析技术 1. 项目概述1.1 技术背景1.2 项目特点 2. 技术架构与算法原理2.1 系统架构2.2 核心算法2.3 模型选择 3. 项目部署与运行指南3.1 环境准备硬件要求软件依赖 3.2 项目配置3.3 运行项目基本运行模式高级参数 4. 常见问…

为什么要选择七彩喜数字康养平台?加盟后有何优势?

一&#xff0e;七彩喜数字康养平台 1.技术领先性 七彩喜依托“端-网-云-脑”四层技术架构&#xff0c;整合毫米波雷达、AI算法引擎、区块链等前沿技术&#xff0c;解决传统养老的隐私泄露、设备孤岛等痛点。 比如非接触式健康监测系统通过毫米波雷达实现跌倒检测准确率&#…

【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析

基于OpenCV的车牌识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理1) 自适应光照补偿2) 边缘增强 2.2 车牌定位1) 颜色空间筛选2) 形态学操作3) 轮廓分析 2.3 字符分割1) 投影分析2) 连通域筛选 2.4 字符识别 3. 实战部署指南3.1 环境配置3.2 项目代码解析 4.…

鸿蒙接入flutter环境变量配置windows-命令行或者手动配置-到项目的创建-运行demo项目

鸿蒙接入flutter环境变量配置 参考官网 下载flutter git clone https://gitcode.com/openharmony-sig/flutter_flutter.git git checkout -b dev origin/dev # 国内镜像 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.fl…

Flink CDC—实时数据集成框架

Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;&#xff0c;它基于数据库日志的 CDC&#xff08;变更数据捕获&#xff09;技术实现了统一的增量和全量数据读取。 该工具使得用户能够以 YAML 配置文件…