Problema de ViewExpiredException no JSF 2.0

Olá Pessoal,

Possuo um sistema (JSF 2.0 (Mojarra), Jboss Seam(Weld), UrlRewriteFilter) de autenticacao e paginas(facelets).
Quando a sessao do usuario expira, teria que retornar para o login e apos autenticar iria para a pagina que o usuario estava.

Quando a sessão expira no JSF apresenta a excecao ViewExpiredException.

  • Primeiro tentei tratar com session. Criei uma classe que estende a ExceptionHandlerWrapper para tratar a excecao(ViewExpiredException), em que eu coloco as urls(anteriores) de acesso na session e tento buscar na classe(exception) mapeada. Porem, retorna nao consigo obter os atributos da session do usuario, apenas retorna null. Só consigo pegar os atributos na session através dos ManagedBeans.
    http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2

  • Outra alternativa que vi seria utilizar client-side, mas a aplicacao JSF esta como server-side

  • Também eu poderia deixar o time-out da sessao ilimitado. Que não seria uma boa prática.

  • Tentei customizar a tela de login com um campo hidden, cujo valor requestScope[‘javax.servlet.forward.request_uri’], mas o mesmo retorna null

Se puderem me ajudar ficarei agradecido.
Att,
Diego

Não dá para usar filter ou um evento de phase listener que verificaria a tela a ser carregada.
De algum jeito deve dar para pegar se expirou a sessão, daí redirecionaria para a tela de login.

lele_vader,

Até consigo enviar para a página de login se ocorrer a exception.

Utilizando filtro, listener ou ExceptionHandlerFactory.
Mas o problema esta posteriormente, se a pessoa logar ela tem que retornar para a pagina que ela estava no ato que expirou

Putz.
Mas como tu iria pegar a página que a pessoa estava quando ela expirou.
Isso podia acontecer até dias depois que expirou.

Então, iso é um dos grandes problemas e também como trabalho com urls amigáveis utilizando o UrlRewriteFilter fica mais difícil ainda.

Comecei a fazer com session/cookie setando no urlRewrite e tentava buscar o atributo da session através de uma classe que trata a ViewExpiredException. Mas sempre retorna null.

Fugindo do assunto do tópico, mas tem como você me passar um exemplo de url rewriting usando esse framework ?

Entao, tem dois modos interessantes que eu vi para fazer url amigavel com jsf

Uma era com prettyfaces e a outra com urlrewritefilter

Com prettyfaces nao lembro mtu bem, mas tives uns problemas com a minha aplicação. Mas funciona normals tbm

Com urlrewrite eu utilizei com regex. Exemplo:

<urlrewrite> <rule match-type="regex"> <from>^/produto/([a-zA-Z]*\d*-*)+/(\d{4}-\d{2}-\d{2})/([0-9]+)$</from> <to>/produto.xhtml?idProd=$3</to> </rule> </urlrewrite>

Olá,

Não sei se é a solução mais bonita, mas, um cara deu a ideia de passar a url atual como parâmetro de request: Redirect user to current page after session expire when the user resumes.

Parece que o spring security oferece formas mais simples de fazer isso (segundo o mesmo link), mas, numa olhada rápida não achei exemplos.

Eu mudei minha aplicação para client-side

Coloquei isso no web.xml

<context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param>

Embora isso não seja aconselhável, mas para o q eu estava me propondo a fazer, funcionou perfeitamente.

Alys,

Acredito que também daria para fazer por paramentro de request utilizando um filter, mas queiria a melhor solução.

Em relação a Spring Security eu trabalhei mais com autenticação com ROLE. Olhei rapidamente umas soluções e vi nesse no site abaixo,
mas nao resolveria

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html

fkazeredo,

Como disse anteriormente minha aplicação é server-side, mas obrigado!

Post é um pouco antigo, mas a ViewExpiredException é bem simples de ser resolvida. Ocorre quando a sessão expirou.

Para resolve-la basta adicionar no web.xml um error-page:

<error-page>
	    <exception-type> javax.faces.application.ViewExpiredException </exception-type>
	    <location>/sessao-expirada.jsf</location>
 	</error-page>