Salvar URL no contexto JSF

4 respostas
B

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:
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);
	}

4 Respostas

A

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");
B

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

A

Para colocar o atributo na sessão faz assim:

HttpSession session = request.getSession();  
session.setAttribute("nomeAtributo", valorAtributo);
B

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?
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
	}

}
Criado 13 de março de 2011
Ultima resposta 14 de mar. de 2011
Respostas 4
Participantes 2