Хранение переменных сеанса в Lift Scala - PullRequest
8 голосов
/ 10 октября 2009

Я пытаюсь сохранить переменную сеанса, а затем использовать ее для изменения меню в 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), но он никогда не может его найти, поэтому я подумал, что это может сработать, но я продолжаю получать пустое поле при обращении к нему, даже если выполняются фактическая привязка и функция до рендеринга меню.

Любая помощь будет высоко ценится.

Спасибо

Ответы [ 2 ]

10 голосов
/ 10 октября 2009

Чтобы получить значение из 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
0 голосов
/ 30 октября 2009

Я думаю, что разъединение в том, что вы предполагаете, что Атрибут сеанса будет соответствовать вашему SessionVar , но это не так. Lift - это очень безопасный фреймворк, и один из его особенностей заключается в том, что Lift создает непрозрачные GUID для ссылки на компоненты в на стороне сервера.

Если вы хотите, чтобы getSessionAttribute что-то вернул, подумайте, как вы можете позвонить setSessionAttribute.

...