Salvar URL no contexto JSF

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 :slight_smile:
Testei aqui mas não deu muito certo… parou de dar null pointer porem tambem não redirecionou :frowning:
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;

/**

  • Servlet Filter implementation class FiltroLogin
    */
    @WebFilter("/FiltroLogin")
    public class FiltroLogin implements Filter {

    /**

    • Default constructor.
      */
      public FiltroLogin() {
      // TODO Auto-generated constructor stub
      }

    /**

    • @see Filter#destroy()
      */
      public void destroy() {
      // TODO Auto-generated method stub
      }

    /**

    • @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
      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();

      HttpSession session = req.getSession();

      Object user = null;
      user = req.getSession().getAttribute(“usuario”);
      if (user == null) {

       session.putValue("url", url);
       
       resp.sendRedirect("/memoriavirtual/faces/login.jsp");
       return;
      

      }
      else if (url.contains(“logado.jsp”)) {

       String urlDireta = session.getAttribute(url).toString();
       if(urlDireta != null){
       	resp.sendRedirect(urlDireta);
       	
       return;
       }
      

      }

      // pass the request along the filter chain
      chain.doFilter(request, response);
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }

}
[/code]