我不知道为什么,直到今天这才成为问题,而且我有一段时间没有更改此控制器中的任何代码,但我突然似乎无法在使用 Play 2.6 制作的应用程序中保存跨请求的信息。在我的 LoginController 中,当用户在表单中填写其凭据时,我会从 POST 请求中调用此方法:
def attemptLogin() = Action {
implicit request: Request[AnyContent] => {
loginform.bindFromRequest().fold(
formWithErrors => BadRequest(views.html.login(formWithErrors)),
successfulForm => {
val validator: DbInputValidator = ... // validation object, stores Form info
if (validator.inputsAreValid) {
val userName = ... // retrieves user name from Form info
Ok(views.html.loginSuccess())
.withSession(request.session + ("authenticated" -> "true") + ("username" -> userName))
.withHeaders(SecurityHeadersFilter
.CONTENT_SECURITY_POLICY_HEADER -> " .fontawesome.com .fonts.googleapis.com maps.googleapis.com")
} else {
BadRequest(views.html.login(loginform))
}
}
)
}
}
我view.html.successLoginResponse
的负载如下:
@()(implicit request: RequestHeader)
@getAuthAndUserName = @{
val foundUsername: String = request.session.get("username").getOrElse("no username found")
val foundAuthenticated: String = request.session.get("authenticated").getOrElse("No authentication found")
s"$foundUsername and $foundAuthenticated"
}
@main("Successful Login") {
@landingnavbar("login")
<div class="container">
<h1>Login Successful</h1>
<h2>The auth token and username are:</h2>
<h2 id="headerValues">@getAuthAndUserName</h2>
<h2>Redirecting you to the Dashboard in...</h2>
<h3>
<div id="counter">3</div>
</h3>
</div>
<!-- JS here which automatically redirects to a URL after countdown -->
<script>...</script>
}
但是当这个加载时,我在视图中的方法检索到的值是“未找到用户名”和“未找到身份验证”的“否则”结果
很明显,返回的 OK 请求没有存储信息,即使我确实将它们添加到
.withSession(request.session + ("authenticated" -> "true") + ("username" -> userName))
代码中的行。在今天之前,它会这样做并且不会将信息显示给我,但是在任何后续页面加载时,该请求将检索数据,并且我将能够获取用户名或身份验证检查。它是否抓住了顶部的隐式请求并将其加载到视图中?从第一次调用的请求的旧版本attemptLogin()
?如果是这样,我如何让它取而代之的是新的会话数据?
我试着做
request.session + ("authenticated" -> "true")
request.session + ("username" -> userName)
就在Ok(...)
回应之前,但这并没有发生。