revel模板中通过{{.session.key}}读取session值,但需先在controller中调用c.session.set()写入;session是string→string映射,不支持嵌套键,未设置时返回空字符串,敏感信息不应存入,登录态判断和跳转必须在controller中处理。

Revel模板里直接用.Session取值就行,但得先确认Session已启用且写入过数据
Revel默认开启Session(基于cookie),但不会自动持久化任何数据——你得在Controller里显式调用session.Set()存值,模板才能读到。常见错误是以为登录后Session自动带user_id之类字段,其实什么都没有,全靠自己塞。
比如在App.Controller中写:
func (c App) Login() revel.Result {
c.Session.Set("username", "alice")
return c.Render()
}之后模板才能访问.Session.username。
模板中读Session的语法是{{.Session.key}},注意key区分大小写且不能含点号
Revel把Session映射为一个map[string]string,模板引擎直接解引用。所以{{.Session.username}}能取到值,但{{.Session.user.name}}会报错——Session里没有嵌套结构,key就是字符串键名。
实际使用时注意:
- 如果key不存在,
{{.Session.missing}}渲染为空字符串,不会panic也不会报错 - 中文或特殊字符作key没问题,但建议只用ASCII字母/数字/下划线,避免编码歧义
- 不要在模板里写
{{.Session.password}}这类敏感字段——Session本就该只存ID或token,明文密码早该被过滤掉
Session过期或未设置时,{{.Session.xxx}}返回空,别指望它触发重定向
模板层没有逻辑分支能力,{{if .Session.uid}}...{{end}}可以判断是否为空,但没法主动跳转或调用函数。常见误操作是想在模板里“检测登录态并跳转”,这必须在Controller里做:
创建全面的交接文档,使新AI代理能够无缝继续工作,消除歧义。解决上下文耗尽问题。 时机:(1)用户请求保存交接,(2)上下文即将满,(3)主要任务完成,(4)会话结束,(5)恢复工作时。 关键词:保存状态、创建交接、上下文已满、暂停、从...恢复、加载交接、保存进度、会话转移、交接
func (c App) Index() revel.Result {
if c.Session.Get("uid") == nil {
return c.Redirect("/login")
}
return c.Render()
}
另外,Revel的Session默认有效期是24小时(app.session.expires = 86400),改配置要重启服务,热加载不生效。
调试Session内容最简单的方法:模板里加{{printf "%v" .Session}}
开发时不确定Session里有啥,直接打印整个map最省事。注意{{printf "%v" .Session}}输出的是Go格式的map,类似map[username:alice],不是JSON。上线前务必删掉,避免泄露信息。
如果打印出来是空map(map[]),说明Controller没调用Set,或者中间件清除了Session(比如用了revel.Intercept但没放行)。
Session底层用的是HTTP cookie,默认加密(密钥来自app.secret),所以抓包看到的是乱码,别慌——这是正常行为。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










