[RESOLVIDO]Redirecionamento apos a sessão expirar (JSF 2.0 + Primefaces 3.0)

Olá,

Quando a minha sessão expira, e o usuário tentar fazer alguma requisição para o server, ele redireciona para a minha pagina de login, para isso funcionar eu coloco a seguinte configuração no meu web.xml:

<error-page> <exception-type>javax.faces.application.ViewExpiredException</exception-type> <location>/login.xhtml</location> </error-page>

Até ai tudo certo, funciona perfeitamente, mas o problema é quando é feita uma requisição ajax, a tela fica travada e ele não redireciona para a pagina de login.

Grato.

Ajax realmente não é feito para realizar redirecionamentos.

Vc terá que procurar como redirecionar utilizando ajax, talvez por phaselistener. Veja se esse post te ajuda: http://semprejava.wordpress.com/2010/08/04/25/.

Então, tentei seguir este exemplo:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#RequestErrorsAndSessionExpirationHandling
Porém, não funcionou, estou usando o ajax do primefaces, deve ser por isso.

Obrigado pela ajuda.

[quote=fernandosc]Então, tentei seguir este exemplo:
http://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#RequestErrorsAndSessionExpirationHandling
Porém, não funcionou, estou usando o ajax do primefaces, deve ser por isso.

Obrigado pela ajuda.[/quote]
Eu creio que você está utilizando o Ajax do Mojara (ou qualquer outra implementação) e não ajax do Primefaces. Até onde eu sei ele os exemplos dele rodam com Mojara.
Ele não implementou o Ajax apenas faz uso dele.
Boa sorte aí. [=

Conseguir resolver meu problema seguindo este exemplo:
http://wiki.icefaces.org/display/ICE/Spring+Security

fernandosc

Estou com o mesmo problema, você teve que adiconar o icefaces ao seu projeto?
Ou resolveu apenas com o spring security?

Obrigado

Apenas com o Spring Security.

uma altenativa ainda mais simples é usar a API OmniFaces 1.1: http://showcase-omnifaces.rhcloud.com/

após configurar seu classpath, simplesmente adicione no seu faces-config.xml

 <factory>
        <exception-handler-factory>
            org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
        </exception-handler-factory>
    </factory>

No meu ambiente (glassFish 3.1.2, primeFaces 3.3.1, mojarra 2.1.6) funcionou muito bem !

uma boa alternativa

[code]

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
ServletException {

try {
// chain…
HttpServletRequest request = (HttpServletRequest) req;

if (isAjax(request) && !request.isRequestedSessionIdValid()) {
log.warn(“Session expiration during ajax request, partial redirect to login page”);
HttpServletResponse response = (HttpServletResponse) resp;
response.getWriter().print(xmlPartialRedirectToPage(request, “/login?session_expired=1”));
response.flushBuffer();
}
else {
chain.doFilter(req, resp);
}

} catch (Exception e) {
// redirect to error page
HttpServletRequest request = (HttpServletRequest) req;
request.getSession().setAttribute(“lastException”, e);
request.getSession().setAttribute(“lastExceptionUniqueId”, e.hashCode());

log.error("EXCEPTION unique id: " + e.hashCode(), e);

HttpServletResponse response = (HttpServletResponse) resp;

if (!isAjax(request)) {
response.sendRedirect(request.getContextPath() + request.getServletPath() + “/error”);
} else {
// let’s leverage jsf2 partial response
response.getWriter().print(xmlPartialRedirectToPage(request, “/error”));
response.flushBuffer();
}
}
}

private String xmlPartialRedirectToPage(HttpServletRequest request, String page) {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version='1.0' encoding='UTF-8'?>");
sb.append("<redirect url="").append(request.getContextPath()).append(request.getServletPath()).append(page).append(""/>");
return sb.toString();
}

private boolean isAjax(HttpServletRequest request) {
return “XMLHttpRequest”.equals(request.getHeader(“X-Requested-With”));
}[/code]