Filter

12 respostas
R

Galera, tudo bem?

Estou aprendendo a utilizar filters em minha aplicação. O problema é que eu coloquei para filtrar arquivos .jsp para que seja visto se o usuario tem uma sessão valida ou não. Mas o filter não esta deixando a pagina ser exibida, aparece uma pagina em branco, mesmo se o usuario tiver uma sessão valida.

Gostaria que vocês olha-se a minha logica de programação para ver se tem algum erro ou dar alguma sugestão.

XML

...
<servlet>
    <description></description>
    <display-name>MeuFiltro</display-name>
    <servlet-name>MeuFiltro</servlet-name>
    <servlet-class>br.pronto.atendimento.servlet.MeuFiltro</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MeuFiltro</servlet-name>
    <url-pattern>/MeuFiltro</url-pattern>
  </servlet-mapping>
  <filter>
	<filter-name>MeuFiltro</filter-name>
	<filter-class>br.pronto.atendimento.servlet.MeuFiltro</filter-class>
	<init-param>
	<param-name>param1</param-name>
	<param-value>valor1</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>MeuFiltro</filter-name>
	<url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
	<filter-name>MeuFiltro</filter-name>
	<servlet-name>MeuFiltro</servlet-name>
  </filter-mapping>
...

Filtro

public class MeuFiltro implements Filter {
	private FilterConfig filterConfig;
	
	public void init( FilterConfig filterConfig ) {
		this.filterConfig = filterConfig;
	}

	public void destroy() {
		System.out.println("Filtro destruído!");
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain filter) throws IOException, ServletException {
		
		System.out.println("Filtro iniciado!");
		
		HttpServletRequest request = (HttpServletRequest) req; 
		HttpServletResponse response = (HttpServletResponse) res;
		
		ConfUsua confUsua = new ConfUsua();
		
		confUsua.Sessao(request, response);
	}

Valida Sessão.

public class ConfUsua {
	
	HttpSession sessao;
	Usuario usuario = null;
	String pagina = "login.html";
	
		
	public void Sessao(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ 
		
		sessao = request.getSession(false);
						
		if(sessao != null)		
		{	usuario = (Usuario) sessao.getAttribute("usuario");
			
			if(sessao.getAttribute("id") != sessao.getId())
			{		
				response.sendRedirect(DirecionaPagina());
			}
		}
		
		else
			response.sendRedirect(DirecionaPagina());
				
							
	}
	
	public String DirecionaPagina(){
		return pagina;
	}
}

12 Respostas

G

Na função doFilter voce deve acrescentar a linha:

filter.doFilter(request, response);

Pois ele tem que continuar o processo, passar por todos os filtros para depois montar a pagina, e passar pelos filtros de novo…

R

Cara, não entendi a logica.

Tem como vc me explicar?

R

Aproveitando tbm.

Eu quero filtrar tbm todos os meus arquivos .do menos um (Controlador.do).

Tem como eu colocar isso no xml? ou vou ter q mapear todos os arquivos .do menos o que eu quero

G

Toda requisição no site passa pelo método doFilter de todos os Filtros.

Para que a operação complete com sucesso, você precisa passar a vez, ou seja, chamando o filter.doFilter(request, response); você passa a bola pros outros e depois volta pro seu filtro , com o request e o response montados…

Da uma lida em algum tutorial sobre o assunto…

Aqui mesmo no GUJ tem um:

http://www.guj.com.br/java.tutorial.artigo.11.1.guj

R

Valeu…

Obrigado.

Fica com Deus

R

vc poderia simplesmente mudar o mapeamento Controlador.do para outra coisa, exemplo bem tosco de nome “Controlador.do2”. Assim, o filtro nao estará associado a esse ultimo.

Agora se vc precisar que o Controlador termine com “.do”, por ex. por ser alguma coisa do struts, ou jsf, ou etc… aih voce pode adicionar mais um mapeamento para a servlet… aih vc decidia se esse mapeamento conteria exatamente o mapeamento para nao permitir um acesso muito amplo, ou se vc definiria o mapeamento para *.do2 tb:

ex.:

<filter-mapping>
	<filter-name>nome_do_filtro</filter-name>
	<url-pattern>*.do</url-pattern>
</filter-mapping>

<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

//Adiciona o mapeamento do controlador.do2

<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>Controlador.do2</url-pattern>
</servlet-mapping>

Com isso, seu Controlador vai continuar sendo processado pela servlet action e nao vai ser filtrado pelo seu filtro.

Resolve?

R

Cara, eu acho que resolve sim.

Obrigado pela ajuda.

R

Cara, deu certo.

Mas primeiro ele ta executando o .do para depois filtrar.

Tem como filtrar primeiro para depois executar o .do?

R

Cara, deu certo.

Mas primeiro ele ta executando o .do para depois filtrar.

Tem como filtrar primeiro para depois executar o .do?

R

Rapaz… depende de onde vc colocou o

filter.doFilter(request, response)

Indiscutivelmente, a primeira coisa que eh feita eh chamar o metodo do filtro… dentro desse metodo vc pode executar o que quiser antes do “.do”… aih vc chama o doFilter(…), pra executar o “.do”, e se vc quiser fazer qualquer coisa depois do “.do” eh soh botar mais codigo apos a chamada a doFilter(…).

Nao vi onde vc colocou a chamara a doFilter(…)… mas acredito que vc tenha colocado ela na primeira linha do metodo do filtro…

Seria isso? Se n for isso, coloca o codigo do seu filtro pra a gente dar uma olhada.

vlw.

R

Codigo do Filter

package br.pronto.atendimento.servlet;

import java.io.IOException;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.pronto.atendimento.ConfUsua;

public class MeuFiltro implements Filter {
	private FilterConfig filterConfig;
	
	public void init( FilterConfig filterConfig ) {
		this.filterConfig = filterConfig;
	}

	public void destroy() {
		System.out.println("Filtro destruído!");
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain filter) throws IOException, ServletException {
		
		HttpServletRequest request = (HttpServletRequest) req; 
		HttpServletResponse response = (HttpServletResponse) res;
						
		System.out.println("Filtro iniciado!");
				
		ConfUsua confUsua = new ConfUsua();
		
		confUsua.Sessao(request, response);
		
		filter.doFilter(request, response);  
	}
}

Acho q não tem nada de errado.

Eu so não sei por que da o erro no .do

R

Descobri o erro. Estava faltando eu trazer da classe ConfUsua um boolean da validação.

Erro de logica.

Obrigado pela ajuda

Criado 3 de dezembro de 2007
Ultima resposta 6 de dez. de 2007
Respostas 12
Participantes 3