Ola a todos, queria pedir ajuda com algum que acredito ser simples porem não entendo muito do assunto…
Estou em um projeto que utiliza JSF + Filtro + EJB + JPA e estou tentando criar o sistema de autenticação (login + logout)…
Para isso estou utilizando um Filtro… porem quando a pessoa entra com uma url que precisa de autenticação eu mando ela para a pagina de login… porem queria uma maneira de salvar a url original que o usuario entrou para redirecionar ela depois do login…
Tentei salvar no contexto dentro do Filtro porem não da certo pois o FacesContext.getCurrentInstance().getExternalContext() me retorna null…
Alguem pode me dar uma sugestão melhor???
O meu método doFilter do filtro estava o seguinte antes de descobrir que o contexto retorna null:
[code] public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String url = req.getRequestURL().toString();
Object user = null;
user = req.getSession().getAttribute("usuario");
if (user == null) {
FacesContext.getCurrentInstance().getExternalContext();
.getSessionMap().put("url", url);
resp.sendRedirect("/memoriavirtual/faces/login.jsp");
return;
}
else if (url.contains("logado.jsp")) {
String urlDireta = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario").toString();
if(urlDireta != null){
resp.sendRedirect(urlDireta);
return;
}
}
// pass the request along the filter chain
chain.doFilter(request, response);
}[/code]
O problema é que nesse momento não se tem formado o FacesContext. Para recuperar a sessão tenta assim:
HttpSession session = request.getSession();
E para pegar algum atributo é só fazer:
(TipoDoObjeto)session.getAttribute("objeto");
Muito obrigado pela resposta 
Testei aqui mas não deu muito certo… parou de dar null pointer porem tambem não redirecionou 
Como só redireciona se o urlDireta for diferente de null, talvez esteja retornando um objeto nulo…
Outro coisa que percebi é que o método session.putValue é deprecated… não não sei se estou usando ele certo tb para por a url na sessao dentro do filtro…
Se puderem me dar mais alguma luz agradeco
Para colocar o atributo na sessão faz assim:
HttpSession session = request.getSession();
session.setAttribute("nomeAtributo", valorAtributo);
Entendii, arrumei isso mas ainda sim não esta redirecionando após passar pelo filtro =/…
Estou postando todo o codigo do filtro, se alguem puder dar uma olhada e achar o problema agradeço…
Outra coisa que pensei agora é que quando realizo o login tem uma regra no JSF que se for sucesso é redirecionado para a pagina logado.jsp… mas estou achando que o fato da regra não modificar o URL que não esta deixando ser redirecionado pelo filtro…
Pensei agora em colocar a regra para dar redirect em vez de foward… porem perderei os dados do managed beans… seria uma boa mudar o escopo do managed beans utilizado para logar de request para session para nao perder os dados no redirect? Ou tem outra saida melhor?
[code]package br.usp.memoriavirtual.filtro;
import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
}
[/code]