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:
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{// TODO Auto-generated method stub// place your code hereHttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseresp=(HttpServletResponse)response;Stringurl=req.getRequestURL().toString();Objectuser=null;user=req.getSession().getAttribute("usuario");if(user==null){FacesContext.getCurrentInstance().getExternalContext();.getSessionMap().put("url",url);resp.sendRedirect("/memoriavirtual/faces/login.jsp");return;}elseif(url.contains("logado.jsp")){StringurlDireta=FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario").toString();if(urlDireta!=null){resp.sendRedirect(urlDireta);return;}}// pass the request along the filter chainchain.doFilter(request,response);}
O problema é que nesse momento não se tem formado o FacesContext. Para recuperar a sessão tenta assim:
HttpSessionsession=request.getSession();
E para pegar algum atributo é só fazer:
(TipoDoObjeto)session.getAttribute("objeto");
B
baldacim
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…
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?
packagebr.usp.memoriavirtual.filtro;importjava.io.IOException;importjavax.faces.context.FacesContext;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;/** * Servlet Filter implementation class FiltroLogin */@WebFilter("/FiltroLogin")publicclassFiltroLoginimplementsFilter{/** * Default constructor. */publicFiltroLogin(){// TODO Auto-generated constructor stub}/** * @see Filter#destroy() */publicvoiddestroy(){// TODO Auto-generated method stub}/** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{// TODO Auto-generated method stub// place your code hereHttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseresp=(HttpServletResponse)response;Stringurl=req.getRequestURL().toString();HttpSessionsession=req.getSession();Objectuser=null;user=req.getSession().getAttribute("usuario");if(user==null){session.putValue("url",url);resp.sendRedirect("/memoriavirtual/faces/login.jsp");return;}elseif(url.contains("logado.jsp")){StringurlDireta=session.getAttribute(url).toString();if(urlDireta!=null){resp.sendRedirect(urlDireta);return;}}// pass the request along the filter chainchain.doFilter(request,response);}/** * @see Filter#init(FilterConfig) */publicvoidinit(FilterConfigfConfig)throwsServletException{// TODO Auto-generated method stub}}