golang中web框架-Beego之Cookie

673 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Beego之Cookie

1.Http是无状态的协议,服务器不能记录浏览器的访问状态,也就是服务器不能区分两次请求是否是来自同一个客户端。

2.Cookie实际上是服务器保存在浏览器上的一段信息,浏览器有了Cookie之后,每次向服务器发送请求都会带着该信息进行访问,服务器在收到请求之后,就可以通过该信息进行处理。

3.Cookie由服务器创建,并发给浏览器,最终由浏览器保存。

Cookie一般用于保持用户登陆状态,电商网站的购物车等。

关于Cookie的详细介绍,我们在之前的章节中已经说的很清除了,本章我们重点说明一下Beego如何操作Cookie。

Beego操作Cookie,无非就是两个方法,一个是设置,一个是获取:

c.Ctx.SetCookie(key,value,有效时长...)

c.Ctx.GetCookie(key)

源代码如下:

func (ctx *Context) SetCookie(name string, value string, others ...interface{}) {
    ctx.Output.Cookie(name, value, others...)
}
func (ctx *Context) GetCookie(key string) string {
    return ctx.Input.Cookie(key)
}
  1. 设置Cookie

首先新建一个Controller:

新建go文件testlogin.go,并创建TestLoginController:

type TestLoginController struct {
    beego.Controller
}

然后注册路由:

修改router.go文件中的init()方法:

func init() {
    beego.Router("/", &controllers.MainController{},"get:Get;post:Post")
    beego.Router("/test", &controllers.TestController{},"get:TestGet;post:TestPost")
    beego.Router("/testinput", &controllers.TestInputController{},"get:TestInputGet;post:TestInputPost")
    beego.Router("/testlogin", &controllers.TestLoginController{},"get:Login;post:Post")
}

然后再testlogin.go文件中添加一个Post()方法,用于用户首次登录,并设置Cookie:

func (c *TestLoginController) Post() {
    u := UserInfo{}
    if err := c.ParseForm(&u); err != nil {
        log.Panic(err)
    }
    fmt.Println("Post()方法中:username:",u.Username,",password:",u.Password)
    //设置cookie
    c.Ctx.SetCookie("username",u.Username,100,"/")
    c.Ctx.SetCookie("password",u.Password,100,"/")

    c.Ctx.WriteString("Username:" + u.Username + ",Password:" + u.Password)

}

SetCookie的第三个参数是时间,单位是秒 ,如果不设置时间,Cookie只在本次回话有效,默认存活时间为3600秒。第四个参数是Cookie设置路径。

  1. 获取Cookie

接下来添加Login()方法,用于客户端直接输入网址时get请求,此时我们需要获取cookie,并验证cookie是否有效:

func (c *TestLoginController) Login() {
    //获取cookie
    username := c.Ctx.GetCookie("username")
    password := c.Ctx.GetCookie("password")

    fmt.Println("Login()方法中:username:",username,",password:",password)
    //验证用户名和密码:
    if username != "" {
        c.Ctx.WriteString("Username:" + username + ",Password:" + password)
    } else {

        c.Ctx.WriteString(`<html><form action="http://127.0.0.1:9527/testlogin" method="post">
                                    用户名:<input type ="text" name="Username" />
                                    <br/>
                                    密&nbsp&nbsp&nbsp码:<input type="password" name="pwd">
                                    <br/>
                                    <input type="submit" value="提交">

                                </form></html>`)
    }
}

如果cookie有效,我们直接在页面显示用户名和密码。否则我们跳转到登录页面。

重启项目,并打开浏览器输入网址:http://127.0.0.1:9527/testlogin

第一次打开,效果如下:

image-20210727144048729

此时经过get请求,执行对应的Login()方法,但是因为没有cookie,所以执行else中的内容,显示出登录页面。

然后我们输入用户名和密码,点击按钮进行提交。此时通过post请求,执行对应的Post()方法,显示登录信息,并且设置cookie。

image-20210727144114110

接下类,我们再次重新输入地址:http://127.0.0.1:9527/testlogin。 发现还是登录成功页面,因为经过get请求,执行Login()方法时,可以获取到cookie,会直接显示登录信息,而无需用户再次登录了。

image-20210727144207983