Stockage des variables de session dans Scala Lift
Question
Je suis en train de stocker une variable de session, puis l'utiliser pour modifier le menu Boot.scala. Voici comment je stocke la variable dans un extrait:
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")))
}
Ensuite, dans Boot.scala Je fais ceci:
val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
"not a student session")
J'ai aussi essayé d'appeler l'objet par son nom (sessionUserType), mais il ne peut jamais le trouver, donc je pensais que cela pourrait fonctionner, mais je continue à recevoir une boîte vide quand je y accéder même si la liaison réelle et la fonction s'exécution avant le rendu du menu.
Toute aide serait très apprécié.
Merci
La solution
Afin d'obtenir une valeur de SessionVar
ou RequestVar
, appelez is
méthode sur elle, à savoir sessionUserType.is
Par ailleurs, avez-vous lu " Gestion Etat "?
Side note
Je crois RequestVar
est un meilleur ajustement dans votre cas. Je ne suis pas sûr que je pourrais attraper votre code droit sans le contexte, mais il pourrait être réécrite au moins comme:
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
Autres conseils
Je pense que la déconnexion est que vous présumez que Session Attribute va correspondre à votre SessionVar , et ce n'est pas le cas. Lift est un très rel="nofollow sécuriser cadre, et l'une de ses caractéristiques est que Lift crée opaques GUIDs de se référer à des composants sur la côté serveur.
Si vous voulez getSessionAttribute
pour revenir quelque chose, pensez à comment vous pouvez appeler setSessionAttribute
.