【GoWeb开发实战】Beego之Cookie

 

 

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)
}

一、设置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:

type UserInfo struct {
    Username string //对应表单中的name值,字段名首字母也必须大写,否则无法解析该参数的值
    Password string `form:"pwd"` //也可以指定form表单中对应的name值,如果不写将无法解析该参数的值
}

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设置路径。

二、获取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

第一次打开,效果如下:

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

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

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

转载地址: https://www.chaindesk.cn/witbook/17/282

 谢谢原作者

 

posted @ 2019-06-16 21:56  大西瓜Paul  阅读(1511)  评论(0编辑  收藏  举报
/*增加返回顶部按钮*/ 返回顶部 /*给标题增加蓝色背景长条*/