Filters

9 respostas
J

Oi…

estou com dúvidas sobre filters…

como posso fazer um filter que a partir de cada requisição ele verifique se o usuário está na session ??

é a melhor maneira de verificar ? pois estou verificando se o usuário está na session em todas as JSPs… e como tenho muitas páginas esse trabalho fica quase impossível…

Obrigado

:wink:

9 Respostas

T

Essa informação de sessão não está disponível para o filtro. (A menos que você considere que se houver um Parameter com nome JSESSIONID esse é o identificador da sessão, mas com um ID você não consegue pegar o objeto HttpSession).

Porque é que você quer saber isso? Se for o caso de verificar, para cada página, se o usuário está logado, você pode simplesmente fazer <%@ page session=“true” %> (que força as páginas a criar uma sessão caso ela não exista) e checar alguma variável na sessão, ou então usar Form-Based Login.

fcmartins
O meu é assim:
package util;

import java.io.IOException;

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.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import beans.Usuario;

public class LoginFilter implements Filter {

  private FilterConfig filterConfig;

  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    if (request instanceof HttpServletRequest) {
      HttpServletRequest httpServletRequest = (HttpServletRequest) request;
      HttpSession session = httpServletRequest.getSession();
      if (session != null && session.getAttribute("usuario") != null) {
        chain.doFilter(httpServletRequest, response);
      }
      else {
        filterConfig.getServletContext().getRequestDispatcher("/login.jsp")
            .forward(request, response);
      }
    }
  }

  public void init(FilterConfig config) throws ServletException {
    this.filterConfig = config;
  }
}
Eu tenho um bean que representa o usuário e que fica na sessão, se não houver sessão ou usuário na sessão eu redireciono p/ a página de login. Além disso você tem que configurar o web.xml para filtrar as requisições. No meu caso:
...
<filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>util.LoginFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
...

Adapte ao seu uso. :P

Essa informação de sessão não está disponível para o filtro.
Claro que está, no filtro você tem acesso ao request e através dele à sessão.
ricardolecheta

coloque um objeto “user” na session… deste jeito vc sabe qual é o usuario…

ricardolecheta

7 segundos antes do meu post, e ainda colocou um código
:smiley:

J

valeu pessoal…

:wink:

M

Estou tendo um probleminha pra implementar isso,estou usando o struts e mapeei o filter para todos os arquivos finalizados por jsp ou .do.
Mas toda vez que eu tento me logar ele passa primeiro pelo filter e vê que não está logado e volta pra pagina de login
então eu nunca consigo colocar o usuario na sessão!
Alguma coisa que possa me ajudar???

B

Estou com o mesmo problema, se alguem puder ajudar… :smiley:

B

marcelo_:
Estou tendo um probleminha pra implementar isso,estou usando o struts e mapeei o filter para todos os arquivos finalizados por jsp ou .do.
Mas toda vez que eu tento me logar ele passa primeiro pelo filter e vê que não está logado e volta pra pagina de login
então eu nunca consigo colocar o usuario na sessão!
Alguma coisa que possa me ajudar???

marcelo_ não sei se eh a melhor solução, na verdade nem sei se pode se dizer que isto é uma solucao… mas acredito que possa quebrar o galho… e se não for a maneira certa, tenho certeza que o pessoal experiente ae ira me corrigir. :smiley:
entaum vamos la… vc disse que nao consegue sair da parte de login, pq o filtro sempre redireciona para ela antes mesmo de se armazenar a session… eu fiz o seguinte…
adicionei esta linha do doFilter logo apos fazer um cast do request

String uri = httpServletRequest.getRequestURI();

entaum no if que verifica que existe uma sessao e se existe o usuario eu adicionei mais uma condicao, segue abaixo o if

if (session != null && session.getAttribute("usuario") != null || uri.endsWith("login.do")) {
        chain.doFilter(httpServletRequest, response);
      }
      else {
        filterConfig.getServletContext().getRequestDispatcher("/pages/login.jsp")
            .forward(request, response);
      }

no meu caso login.do ira controlar a regra de negocio que ira autenticar e armazenar na sessao o usario…
bom agora se isso estiver errado… por favor… me corrija pois estou fazendo desta maneira em meu projeto… :smiley:

5leipn1r

Estou exatamente com o mesmo problema e queria saber se xiste alguma outra solução para isso.
Se eu não me engano, uma vez vi em um artigo que alguma coisa pode ser configurada no arquivo web.xml para que uma determinada pagina seja a pagina de entrada da aplicação, sendo essa exluida de qualquer filtro ou controle. Só que eu não me lembro como faz. Alguém pode ajduar?
Aproveitando o post, deixa eu tirar outra duvida do mesmo assunto…
Se no mapeamento do filtro eu fizer assim:

<filter-mapping> <filter-name>ControleAcesso</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
Ele estaria passando pelo filtro antes de qualquer coisa? Por exemplo pra abrir uma imagem, um servlet, ou qualquer outra coisa?

Como eu mapeio um unico filtro pra mais de uma url-pattern ? por exemplo, eu quero que esse filtro seja pra *.jsp, pra *.htm e pra *.html por exemplo.

Estou com mais um probleminha, quando eu uso minha action /logout, a qual remove o usuario da session e executa um session.invalidate() e redireciona pra pagina de login…
Após isso feito, se na barra de endereços eu digitar /jsp/main.jsp ele abre a pagina main com a session antiga que já foi invalidada. porque o browser num faz um refresh do jsp. Se eu der um refresh na pagina main.jsp aí sim ela volta pra pagina de login por causa do filtro.
Vamos supor que antes de dar o login e o logout minha session id éra 11111111. Quando eu dou o logout e volto pra pagina de login meu novo session id está lá como por exemplo 222222222. Aí quando pela barra de endereço eu acesso o main.jsp ele tá lá com o session id 11111111. Se eu der um refresh ele volta pra pagina de login com o id 222222222. Daí depois de dar o refresh eu num consigo mais entrar na main.jsp pela barra de endereço.
Existe alguma forma de isso não acontecer? Ou isso é normal?

Valew.

Criado 20 de janeiro de 2005
Ultima resposta 23 de set. de 2008
Respostas 9
Participantes 7