Erro inserindo Filter

2 respostas
Luiz_Henrique_Coura

Estou inserindo um Filter na minha aplicação para testar se a sessão do usuário encerrou. Dessa forma, assim que o usuário enviar um Request o Filter irá testar se a sessão existe. Caso não exista eu quero que ele seja encaminhado para uma página (HTML) onde será dado o aviso que sua sessão está encerrada.

o problema é que não está dando certo a forma como eu fiz.

a classe Filter é essa:

.
.
.
    public void doFilter( ServletRequest request, ServletResponse response,
    FilterChain chain )
    throws IOException, ServletException {
        
        HttpServletRequest rq = (HttpServletRequest)request;
        HttpSession session = rq.getSession();
        
        HttpServletResponse rp = (HttpServletResponse)response;
        if( session.getAttribute( "login" ) == null ) {
            rp.sendRedirect( "/aviso.html" );
        }
        
        chain.doFilter(request, response);
        
    }
.
.
.

Quando o usuário entra no sistema, eu seto na sua sessão uma variável chamada LOGIN com o valor OK. Dessa forma essa variável é sempre testada assim que acionado o Filter.

Está tudo certo… bem quase tudo. Quando chega na instrução:

ele não faz nada. Passa batido!!

o que está errado?

2 Respostas

danieldestro

Primeiro:

Tente getSession( false ) ao invés de getSession.

Luiz_Henrique_Coura

Daniel, fiz o seguinte e funcionou.

Fiz o que você propos, mas continuou dando o mesmo problema, então coloquei a instrução chain.doFilter(request, response) dentro de um bloco else e passou a funcionar legal. Ficou assim:

. 
. 
. 
    public void doFilter( ServletRequest request, ServletResponse response, 
    FilterChain chain ) 
    throws IOException, ServletException { 
        
        HttpServletRequest rq = (HttpServletRequest)request;
        HttpSession session = rq.getSession( false );
        
        HttpServletResponse rp = (HttpServletResponse)response;
        if( session == null ) {
            rp.sendRedirect( rq.getContextPath() + "/aviso.html" );
        } else {
            chain.doFilter(request, response);
        }
        
    } 
. 
. 
.

Parece que ele primeiro termina o processamento do método doFilter e depois manda para onde foi direcionado. Então quando eu estava com a instrução chain.doFilter(request, response) fora do bloco else, ele executava o sendRedirect() e depois o chain.doFilter(request, response), causando erro. Só foi colocar o bloco else e passou a funcionar legal.

pensava que o redirecionamento fosse instantaneo.

bem, obrigado pela atenção!!

Criado 22 de outubro de 2004
Ultima resposta 25 de out. de 2004
Respostas 2
Participantes 2