Ajax4JSF e Filter

1 resposta
C
Bom dia galera, estou utilizando o JSF com o Ajax4JSF, tá funcionando blz. Daí surgiu a necessidade de verificar se o usuário tem acesso à página. Esta parte está funcionando em um outro projeto JSF SEM ajax. Então decidi juntar p/ fins de testes. O problema é que quando vai exibir uma página q tenha algum componente Ajax, a mesma não é exibida... o processador fica em 100%. Inclusive estou fazendo testes com MyFaces, achei que fosse conflito entre os dois mas não é, bastou eu incrementar o filter para verificar a persmissão que dá pau. O arquivo web.xml está no link: [url]www.cassitos.oi.com.br/backup_web.xml[/url]. Se eu tirar o Filter (Seguranca), funfa blz. o trecho da classe FiltroSeg é:
... imports...
/**
 *	Classe que será utilizada como filtro para verificar as páginas que o usuário não pode acessar
 */
public class FiltroSeg implements Filter {
	
	private static final Logger logger = Logger.getLogger(com.teste.seguranca.FiltroSeg.class);
	private ServletContext servletContext;
	
	public void init(FilterConfig config) throws ServletException {
		servletContext = config.getServletContext();
	}
	
	public void doFilter(ServletRequest req, ServletResponse res,
					FilterChain chain) throws IOException, ServletException{
		
		boolean voltaLogin = false;
		
		//Obter o objeto HttpServletRequest do Request do Filtro
		HttpServletRequest hreq = (HttpServletRequest) req;
		HttpServletResponse resp = (HttpServletResponse) res;
		String pagina = hreq.getPathInfo();
		//remover a '/' inicinal
		pagina = pagina.substring(pagina.indexOf("/") + 1, pagina.length());
		
		UsuarioSeg usu = UsuarioSessao.getUsuario(req, res, servletContext);
		if (usu != null) {
			//verificar se o usuário tem acesso à página
			if (pagina != null) {
				if (!pagina.toLowerCase().trim().equals(usu.buscaPagina(pagina).toLowerCase().trim())) {
					voltaLogin = true;
				}
			}
		}
		else {
			voltaLogin = true;
		}
		//verificar se deve redirecionar para a página de login,
		//desde que não tenha solicitado as páginas: index.jsp e usu_login.jsp
		if (voltaLogin == true && (!pagina.equals("index.jsp") && !pagina.equals("usu_login.jsp"))) {
			resp.sendRedirect("usu_login.jsp");
		}
		else {
			chain.doFilter(req, res);
		}
	}
	
	public void destroy(){
	}
}
Basicamente, verifica se o usuário que está logado tem acesso à página requisitada. O que não entendi é: caso não esteja logado e tentar acessar a página que tem o componente JSF, redireciona para a página de login. Mas se já estiver logado e tem acesso à página, aí é que "trava".

Se alguem tiver outra idéia de controle de acesso em JSF agradeço caso queira dar uma dica de como pode ser feito.

Obrigado.

1 Resposta

C
bom galera, após tirar uma boa soneca e tomar muita maracujina consegui resolver... ^_^ Ao abrir uma página com componentes ajax4jsf, é feito um acesso à uma "url" do tipo:
2007-03-06 11:34:23,281 INFO [FiltroSeg] - Página: a4j.res/org.ajax4jsf.framework.ajax.AjaxScript 2007-03-06 11:34:23,281 INFO [FiltroSeg] - Página: a4j.res/usu_login.jsp
como no filtro estava verificando se tem acesso aquela página, ele estava redirecionando e fica em um loop violento, meu log ficou com centenas de linhas:
2007-03-06 11:34:23,281 INFO [FiltroSeg] - Página: a4j.res/usu_login.jsp
Não existe a página a4j.res/usu_login.jsp e sim usu_login.jsp, só parou quando dei stop no navegador, claro que foi um baita bug no código da minha classe de acesso. daí alterei para:
public void doFilter(ServletRequest req, ServletResponse res,
					FilterChain chain) throws IOException, ServletException{
		
		boolean voltaLogin = false;
		
		//Obter o objeto HttpServletRequest do Request do Filtro
		HttpServletRequest hreq = (HttpServletRequest) req;
		HttpServletResponse resp = (HttpServletResponse) res;
		String pagina = hreq.getPathInfo();
		//verificar se na url contém o Filter utilizando pelo Ajax4JSF
		//se encontrar o conteúdo, retirar
		String urlAjax = "a4j.res/";
		int posiAjax = pagina.indexOf(urlAjax);
		if (posiAjax &gt= 0) {
			pagina = pagina.substring(urlAjax.length(), pagina.length());
		}		
		//remover a '/' inicinal
		pagina = pagina.substring(pagina.indexOf("/") + 1, pagina.length());
		logger.info("Página: " + pagina);
		
		UsuarioSeg usu = UsuarioSessao.getUsuario(req, res, servletContext);
		if (usu != null) {
			//verificar se o usuário tem acesso à página
			if (pagina != null) {
				//permitir o acesso à página caso encontre o texto a4j.res na url
				//se não encontrar (-1) verificar se tem acesso à página
				if (posiAjax == -1) {
					if (!pagina.toLowerCase().trim().equals(usu.buscaPagina(pagina).toLowerCase().trim())) {
						voltaLogin = true;
					}
				}
			}
		}
		else {
			voltaLogin = true;
		}
		//verificar se deve redirecionar para a página de login,
		//desde que não tenha solicitado as páginas: index.jsp e usu_login.jsp
		if (voltaLogin == true && (!pagina.equals("index.jsp") && !pagina.equals("usu_login.jsp"))) {
			resp.sendRedirect("usu_login.jsp");
		}
		else {
			chain.doFilter(req, res);
		}
	}
	
	public void destroy(){
	}
}
Pelo que percebi, só vai processar o ajax4jsf caso tenha acesso à página, então se encontrar o a4j na url o acesso será permitido. Flw!!
Criado 6 de março de 2007
Ultima resposta 6 de mar. de 2007
Respostas 1
Participantes 1