Armazenamento de variáveis de sessão em elevador scala
Pergunta
Estou tentando armazenar uma variável de sessão e depois usá -la para modificar o menu no boot.scala. Aqui está como estou armazenando a variável em um trecho:
object sessionUserType extends SessionVar[String](null)
def list (xhtml : NodeSeq) : NodeSeq = {
Helpers.bind("sendTo", xhtml,
"provider" -> SHtml.link("/providerlogin",() => sessionUserType("provider"), Text("Provider")),
"student" -> SHtml.link("/studentlogin",() => sessionUserType("student"), Text("Student")))
}
Então em boot.scala eu faço isso:
val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
"not a student session")
Eu também tentei chamar o objeto por nome (sessionUserType), mas ele nunca pode encontrá -lo, então pensei que isso poderia funcionar, mas continuo recebendo uma caixa vazia quando o acessio, mesmo que a ligação e a função reais sejam executadas antes da renderização do menu.
Qualquer ajuda seria muito apreciada.
Obrigado
Solução
Para obter um valor de SessionVar
ou RequestVar
, ligar is
Método, ou seja, sessionUserType.is
A propósito, você leu "Gerenciando estado"?
Nota
Eu acredito RequestVar
é mais adequado no seu caso. Não tenho certeza se poderia pegar seu código certo sem o contexto, mas pode ser reescrito pelo menos como:
case class LoginType
case object StudentLogin extends LoginType
case object ProviderLogin extends LoginType
object loginType extends RequestVar[Box[LoginType]](Empty)
// RequestVar is a storage with request-level scope
...
"provider" -> SHtml.link("/providerlogin",() => loginType(Full(ProviderLogin)), Text("Provider")),
// `SHtml.link` works in this way. Your closure will be called after a user
// transition, that is when /providerlogin is loading.
...
val studentSessionType = If(() => { loginType.is map {_ == StudentLogin} openOr false },
"not a student session")
// As a result, this test will be true if our RequestVar holds StudentLogin,
// but it will be so for one page only (/studentlogin I guess). If you want
// scope to be session-wide, use SessionVar
Outras dicas
Eu acho que a desconexão é que você está assumindo que o a Atributo da sessão vai combinar com o seu SessionVar, e esse não é o caso. Elevador é muito seguro Framework, e outro, se seus recursos é que o elevador cria GUIDs opacos para se referir a componentes no lado do servidor.
Se você quiser getSessionAttribute
Para devolver algo, pense em como você pode ligar setSessionAttribute
.