Хранение переменных сеанса в Lift Scala
Вопрос
Я пытаюсь сохранить переменную сеанса, а затем использовать ее для изменения меню в Boot.scala.Вот как я сохраняю переменную во фрагменте:
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")))
}
Затем в Boot.scala я делаю это:
val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
"not a student session")
Я также пытался вызвать объект по имени (sessionUserType), но он так и не смог его найти, поэтому я подумал, что это может сработать, но я продолжаю получать пустое поле при доступе к нему, хотя фактическая привязка и функция выполняются до рендеринг меню.
Любая помощь приветствуется.
Спасибо
Решение
Чтобы получить значение из SessionVar
или RequestVar
, вызов is
метод на нем, т.е. sessionUserType.is
Кстати, ты читал"Управляющее государство"?
Примечание
Я считаю RequestVar
лучше подойдет в вашем случае.Я не уверен, что смогу правильно уловить ваш код без контекста, но его можно переписать хотя бы так:
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
Другие советы
Я думаю, что разница в том, что вы предполагаете, что Атрибут сеанса будет соответствовать вашему SessionVar, а это не так.Лифт - это очень безопасный Framework, и один, если его функции заключаются в том, что Lift создает непрозрачные гииды для обозначения компонентов на стороне сервера.
Если ты хочешь getSessionAttribute
чтобы что-то вернуть, подумайте, как можно позвонить setSessionAttribute
.