Scala HTML模板中@session.get("id")无法使用问题求助
我来帮你搞定这个问题~ 在Play框架里,模板可不是随便就能直接用session对象的,得先让模板能拿到session的引用才行,给你几个靠谱的解决办法:
方法1:通过隐式参数传递Session(最推荐)
这是Play官方推荐的方式,既安全又符合框架设计:
- 修改你的主模板
main.scala.html,把Session作为隐式参数添加进去:
@(title: String)(content: Html)(implicit session: play.mvc.Http.Session) <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=no" /> <title>@title</title> <!-- 你的其他头部代码 --> </head> <body> <!-- 现在这里就可以正常使用@session.get("id")了 --> @content </body>
- 在控制器渲染模板时,确保Action里有隐式的Session引用。比如你的登录后跳转的Action:
def index = Action { implicit request => Ok(views.html.main("首页") { <p>当前用户ID:@session.get("id").getOrElse("未登录")</p> }) }
另外要注意:你用withSession("id" -> id)设置session时,一定要返回这个新生成的Result对象,比如:
def login = Action { val userId = "user123" // 必须返回withSession生成的Redirect对象,session才会生效 Redirect(routes.HomeController.index()).withSession("id" -> userId) }
方法2:通过请求上下文直接获取(不推荐)
如果你暂时不想修改模板参数,也可以直接在模板里通过请求上下文获取session,但这个方式在Play 2.6+之后被标记为不推荐,因为它依赖线程局部变量,可能有并发问题:
@play.mvc.Http.Context.current().session().get("id")
额外注意事项
- 如果你的项目用的是Play 2.8+,更推荐传递
RequestHeader作为隐式参数,然后从request里拿session:
@(title: String)(content: Html)(implicit request: play.mvc.Http.RequestHeader) <!-- 使用方式 --> @request.session.get("id")
- 如果有子模板嵌套主模板,子模板也需要声明对应的隐式参数,才能正常继承session引用。
内容的提问来源于stack exchange,提问作者user8574635
相关产品推荐
相关产品推荐

