terça-feira, 15 de junho de 2010

Wicket + Google App Engine - Nem Sempre Faz o Login

O cenário é o Google App Engine com o Wicket: você está usando o login do Wicket e quando o usuário clica para ir até a LoginPage e se autentica, o login não funciona. Se você se loga várias vezes, aí sim, uma hora acaba conseguindo se logar.

Quando tentamos pegar o usuário que armazenado na sua classe Session que extends AuthenticatedWebSession, o usuário está nulo. Curiosamente, se você tenta acessar uma página anotada com @AuthorizeInstantiation("ADMIN") por exemplo, tudo funciona bem, o problema acontece apenas no login voluntário.

Depois de muito pesquisar e com a ajuda de @ronaldtm (créditos para ele), descobrimos que o Wicket é stateless em relação a Session do usuário até que ele faça login e por algum motivo, com o AppEngine dá o erro até mesmo depois do login.

Para resolver o problema você precisa forçar a criação da Sessão no construtor da sua LoginPage por exemplo. Coloque a seguinte linha de código.

WicketSession.get().bind();

Onde WicketSession é a classe que extends AuthenticatedWebSession

Se você quiser criar a sessão assim que o usuário acessar sua página para poder armazenar alguma informação, aí você coloca isso no construtor de uma BasePage por exemplo e todas as suas páginas vão forçar a criação da Sessão, mas isso consome recursos do seu servidor.