我有以下简化的模板设置:
现在,当用户登录时,会username设置会话属性,以便我可以确定用户是否已登录.为了帮助我弄清楚用户是否登录,我有以下会话助手对象:
object SessionHelper {
val sessionKey = "username"
def authenticated(implicit request: RequestHeader) = {
request.session.get(sessionKey).exists(_ => true)
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在采用implicit请求对象的模板中使用,例如:
(implicit request: play.api.mvc.RequestHeader)
...
@if(SessionHelper.authenticated) {
<strong>Authenticated!</strong>
}
...
Run Code Online (Sandbox Code Playgroud)
因为 - 据我所知 - 这是在模板中获取隐式变量的唯一方法,这意味着在渲染视图的任何地方,我都需要显式"定义"隐式请求变量.例如:
def index = Action { implicit request =>
Ok(views.html.index(myStuff))
}
Run Code Online (Sandbox Code Playgroud)
没有该implicit request =>语句,它不会编译.虽然这有点尴尬,只要我留在任何"子视图"(例如主页或详细信息)中,这很好,因为对于每个视图我都有一个控制器方法,因此也可以访问隐式RequestHeader实例.但是,当我需要访问我的模板(例如Main)中的会话时,这不起作用,因为它永远不会被控制器显式呈现.
我没有立即看到一种方法来访问模板中的会话,而快速谷歌除了几个关于相同主题的问题之外没有透露任何其他问题.有任何想法吗?
更新:似乎这与此问题有些相关.
我是使用Play Framework 2.0的新手(我正在使用Scala)并对会话有疑问.
我来自Ruby on Rails背景,因此我倾向于考虑我在Play Framework中学习的关于Ruby on Rails的所有内容.
考虑到这一点,当我在视图中时,有没有办法让我调用存储在Session中的东西?
如果我在会话中存储了"hello" - >"world",我希望能够执行类似@ session.get("hello")的操作,并且能够在视图中使用"world".这可能吗?
我看到的另一个选项是将值存储在控制器中的变量中,并通过执行类似OK(var)的操作将其传递给视图,但这种方式似乎有点笨重,特别是如果我开始使用更多变量.
谢谢!
什么是Play的最佳方法!应用程序记住用户?我认为唯一可行的解决方案是使用客户端cookie,对吧?但是一旦浏览器关闭,此会话就会被销毁,对下一个请求无效?你怎么解决(d)这个?
至于现在,我userid在会话(每个会话)中加密,如下所示:
session("userid", user.id);
Run Code Online (Sandbox Code Playgroud)
然后我使用拦截器来避免每当我需要它时传递参数,如下所述:如何避免在play2中传递参数?
但是,如何记住用户,甚至是在下次请求时自动登录用户?
编辑:2016-03-11 请注意,某些浏览器可能会将会话cookie存储更长时间.例如,您可以在Chrome中设置以记住下次访问时打开的标签页.这意味着下次打开浏览器时将恢复Play Session cookie.
从Play 2.4开始,会话cookie maxAge(你需要在其中设置application.conf)被重命名为:play.http.session.maxAge
我是全新的Play框架和Scala.我试图使用Html5 -server发送事件和播放框架将一些事件从服务器推送到浏览器.
我在Scala中遇到过这个例子.我尝试通过扩展play.mvc.Action.Simple来实现java中的动作组合.我不确定如何在动作合成中设置响应头.
http://benquasmalltalk.blogspot.fr/2012/04/hub-interesting-but-undocumented.html
我发送的数据来自数据库而不是枚举.任何指针都会有所帮助
我目前正在使用session()模板中的play框架:
@if(session().get("email")==null){
<li><a href="@controllers.routes.General.login">Login</a></li>
}else{
<li><a href="@controllers.routes.General.logout">Logout</a></li>
}
Run Code Online (Sandbox Code Playgroud)
此模板用于我的所有视图.其中一些视图由Java控制器控制,一些视图由Scala控制器控制.
当我点击导致Java控制器的链接时,我没有问题,正确处理登录和注销的链接.
当我点击导致Scala控制器的链接时,我得到一个[RuntimeException: There is no HTTP Context available from here.]
从我在这里读到的关于scala控制器的内容来看,我理解他们在渲染页面时没有返回http上下文,但我真的希望能够在我的模板中使用会话.
我想session()在我的视图中使用一个参数,模板和控制器,但我相信java会话(play.mvc.http.session)和scala会话(play.api.mvc.session)之间会发生冲突. play会编译html页面.
我被困了?是否有可能强制scala控制器回放http上下文?
我最近开始使用Play!用于编写Java Web应用程序的框架(v2.0.4).在我的大多数控制器中,我遵循暂停HTTP请求的范例,直到满足Web服务响应的承诺.一旦履行承诺,我就会回复AsyncResult.这就是我的大多数动作都是这样的(省略了一堆代码):
public static Result myActionMethod() {
Promise<MyWSResponse> wsResponse;
// Perform a web service call that will return the promise of a MyWSResponse...
return async(wsResponse.map(new Function<MyWSResponse, Result>() {
@Override
public Result apply(MyWSResponse response) {
// Validate response...
return ok(myScalaViewTemplate.render(response.data()));
}
}));
}
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试国际化我的应用程序,但在尝试从async方法渲染模板时遇到以下错误:
[error] play - Waiting for a promise, but got an error: There is no HTTP Context available from here.
java.lang.RuntimeException: There is no HTTP Context available from here.
at play.mvc.Http$Context.current(Http.java:27) ~[play_2.9.1.jar:2.0.4]
at play.mvc.Http$Context$Implicit.lang(Http.java:124) …Run Code Online (Sandbox Code Playgroud) 我希望应用程序的用户可以更改我的play2(播放2.1.1,scala 2.10.1)Web应用程序中的语言.我在i18n的模板中使用了@ Messages.get(...).
我有
application.langs="en,ru"
Run Code Online (Sandbox Code Playgroud)
在application.conf中.我将"en"或"ru"传递给该方法:
def index = Action {
Ok(views.html.index())
}
def changeLanguage(lang:String) = Action {
implicit request =>
Logger.logger.debug("Change user lang to : " + lang)
val referrer = request.headers.get(REFERER).getOrElse(HOME_URL)
Redirect(referrer).withLang(Lang(lang))
}
Run Code Online (Sandbox Code Playgroud)
路线:
GET / controllers.Application.index
GET /index controllers.Application.changeLanguage(lang ?= "ru")
Run Code Online (Sandbox Code Playgroud)
模板束(views.html.index):
@()(implicit l: Lang)
@import play.i18n.Messages
...
<a href="/about">@Messages.get("about")</li>
...
<a href="index?lang=ru" id="ru"></a>
<a href="index?lang=en" id="en"></a>
...
Run Code Online (Sandbox Code Playgroud)
重定向页面后,我用同一种语言看到它.:(
我读了许多旧答案:我的模板中的隐式语言参数不起作用,重定向或带有withLang(...)方法调用的操作也是如此.这么长时间没有好的解决方案?