😅 通过阅读 beego.Controller 源码,发现 session 是 从 context.Input 中获取的,所以目前在router中就使用以下方式来访问session了:
var CustomFilter = func(ctx *context.Context) {
session_key := ctx.Input.CruSession.Get("key")
// do something....
ctx.Redirect(302, "/")
}
beego.InsertFilter("/dashboard/*", beego.BeforeRouter, CustomFilter)
有没有更好的方式?
或者context有没有提供直接操作session的方法?(看了源码,貌似没有,倒是只有setCookie和getCookie)
或者可以在context 中添加2个类似于setCookie和getCookie的方式: getSession(), setSession() 方便访问session:
in file : context.go
func (ctx *Context) GetSession(key string) string {
if ctx.Input.CruSession == nil {
// todo init session....
}
return ctx.Input.CruSession.Get(key)
}
func (ctx *Context) SetSession(name interface{},value interface{}) {
if ctx.Input.CruSession == nil {
// todo init session....
}
ctx.Input.CruSession.Set(name,value)
}
@astaxie 如果要实现这种要求, 在 context 中添加2个方法是否合适?如果合适的话,我就准备提个pr 😄
这两个方法的意义何在?和你直接使用ctx.Input.CruSession.Get(key)有什么区别?
意义我觉得主要有以下几点:
web开发中,session 和 cookie是两个比较重要的东西,一般情况下session依赖于cookie来实现,所以既然Context中提供了直接操作cookie的两个方法,那么对应的,Context 中也应该直接提供操作session的方法
方便开发人员调用. 这种ctx.Input.CruSession.Get(key)的使用方式,是通过阅读源码才知道的, 文档中貌似没有提到在Controller以外的地方如何操作session.
在 beego mvc的架构中, 有一层 路由层,有时候操作session 不一定都是在controlle层,在整个会话生命周期中,应该能从任何地方访问session, 不局限于controller层. 所以更好的方式应该是:beego提供一个更加全局性的方法让开发者能够在整个生命周期中都能操作session, 就像 beego.AppConfig.String/Bool ...一样
web开发中,session 和 cookie是两个比较重要的东西,一般情况下session依赖于cookie来实现,所以既然Context中提供了直接操作cookie的两个方法,那么对应的,Context 中也应该直接提供操作session的方法
ctx.Input.CruSession 也是在context中啊
方便开发人员调用. 这种ctx.Input.CruSession.Get(key)的使用方式,是通过阅读源码才知道的, 文档中貌似没有提到在Controller以外的地方如何操作session.
这个应该是文档问题了,但是你有什么建议呢?我的个人理解是看这个文档https://godoc.org/github.com/astaxie/beego/context 而不是阅读源码。
在 beego mvc的架构中, 有一层 路由层,有时候操作session 不一定都是在controlle层,在整个会话生命周期中,应该能从任何地方访问session, 不局限于controller层. 所以更好的方式应该是:beego提供一个更加全局性的方法让开发者能够在整个生命周期中都能操作session, 就像 beego.AppConfig.String/Bool ...一样
所以才会用filter的函数都是传递context啊
这个应该是文档问题了,但是你有什么建议呢?我的个人理解是看这个文档https://godoc.org/github.com/astaxie/beego/context 而不是阅读源码。
应该改进一下 beego 官网的 关于 session这节的文档
https://beego.me/docs/mvc/controller/session.md , 示例中只有controller中操作session的场景,应该补充一下 其他地方如何操作session,至少应该提供一个router层的示例,毕竟很多都会在router用session进行用户校验
这个问题提得好,我也遇到了与 @javasgl 一样的情况,在controller层操作session很方便,但是在controller以外的地方,要想方便的直接操作session,官方文档关于这方面的说明是在是太少了。在不看源码的情况下,搜了很多资料也基本没有多少收获。看了@javasgl 提到的方法才恍然大悟。希望官网文档针对session的使用可以完善些 @astaxie 。比如全局session与控制器中直接操作的session(beego.Controller.xxxSession)之间关系是怎样的等等
我现在就遇到一个,在自定义模板函数里面 需要session里面的数据,该如何调用 ctx都无法可用了吧
~~!
我也遇到了。
还有个疑问,如何设置session生成的cookie的domain呢?
Most helpful comment
应该改进一下 beego 官网的 关于 session这节的文档
https://beego.me/docs/mvc/controller/session.md , 示例中只有controller中操作session的场景,应该补充一下 其他地方如何操作session,至少应该提供一个router层的示例,毕竟很多都会在router用session进行用户校验