Ajuda com filtro de Login - RESOLVIDO

16 respostas
L

Bom dia gostaria que me ajudassem a entender como funciona esse Filtro de login.

tenho esse Servlet para o verificar o login:
funciona perfeito e se usuario logado manda pra minha pagina principal.

.
.
.
try
{	    

     UserBean user = new UserBean();
     user.setUserName(request.getParameter("un"));
     user.setPassword(request.getParameter("pw"));

     user = UserDAO.login(user);
	   		    
     if (user.isValid())
     {
	        
          HttpSession session = request.getSession(true);	    
          session.setAttribute("currentSessionUser",user); 
          response.sendRedirect("pagina-principal.jsp"); //logged-in page      		
     }
	        
     else 
          response.sendRedirect("invalidLogin.jsp"); //error page 
} 


.
.
.

o filtro

public class FiltroSeguranca implements Filter{   
       
       
	  public void init(FilterConfig config) throws ServletException {
		  


      }
 
 
 
      public void doFilter(ServletRequest req, ServletResponse res,
 
                  FilterChain chain) throws IOException, ServletException {
 
            HttpSession session = ((HttpServletRequest)req).getSession();
 
            UserBean usuario = (UserBean)session.getAttribute("currentSessionUser");
 
            if(usuario == null){
            	session.setAttribute("msg","Você não está logado no sistema!");
 
                  ((HttpServletResponse)res).sendRedirect("../LoginPage.jsp");
 
            }else{
 
                  chain.doFilter(req, res);
 
            }
 
      }
 
 
 
      public void destroy() {
 


      }
 
}

e no web XML:

<welcome-file-list>
    <welcome-file>LoginPage.jsp</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <filter>
    <filter-name>Filtro Seguranca</filter-name>
        <filter-class>br.controle.filtro.FiltroSeguranca</filter-class>
    
  </filter>
  <filter-mapping>
    <filter-name>Filtro Seguranca</filter-name>
    <url-pattern>/*</url-pattern>                            // ja mudei para /paginas/* ou para *.jsp E nada, voltei as paginas para o local padrao agora.
  </filter-mapping>
 
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>br.controle.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>

Nao consigo fazer esse filtro funcionar::

Pelo que entendi (me corrijam se eu estiver errado),
abri o browser, digitei o endereco da aplicacao teria q aparecer a tela de login, se login certo, entra pra pagina principal, caso contrario
ele teria que voltar para a tela de login.

alguem ajuda?
Reforco q o erro esta no filtro pois se tiro ele do WebXml, a aplicacao funciona trankila passando pela tela de login, verfica, etc…

quero bloquear de tal forma q o usuario nao entre direto com o endereco… Ex: http://localhost:8080/Controle/cadastro.jsp
quero bloquear isso no navegador…

Estou usando Jstl e nada de JSF, vi q a maioria dos exemplos estao pra JSF…

Nao vou mexer com JSF agora…

estudos…

16 Respostas

F

Vc pode usar sim sem JSF.
Descreva oque vc gostaria q acontecesse que não esta?
Outra coisa, a mensagem de erro do login no filtro não pode ser colocado na sessão, uma vez que vai perdurar por toda ela. Na verdade vc teria q colocar no escopo request.

L

Entao, qdo eu abro o navegador e coloco o endereco, ele nao abre a tela de login e da o erro:

Redirecionamento incorreto
            
          O Firefox detectou que o pedido para este endereço não será concluído devido à forma que o servidor o está redirecionando.

Erro 404 tbm aparece.
ou entao ele passa direto para
http://localhost:8080/LoginPage.jsp

sendo q o correto seria

http://localhost:8080/Controle/LoginPage.jsp

vc tem alguma sugestao de como melhorar esse meu filtro para q funcione?

acabei de ler ali q as paginas de login devem ficar de fora do filtro, como assim?

F
  1. seu redirect parece estar errado - verifique endereço logico relativo ou completo.
  2. Login tem que ficar de fora sim, uma vez que vc não precisar passar pelo filtro quando ele estiver logando.
  • Dicas - crie duas pastas no seu contexto
  • publica - coloca tudo que é publico, paginas publicas como o login, imagens, css, js.
  • privado - coloca todas os recursos que tem regra de acesso. Coloca o filtro somente para filtrar dentro dessa pasta. (/privado/*)
L

ok vou fazer as modificacoes e posto aki assim que der… tem bastante coisa pra eu mexer… obrigado por enquanto…

L

Filtro:

public class FiltroSeguranca implements Filter{   
      
   public void destroy() {   
   }   
  
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException {   
      HttpServletRequest req = (HttpServletRequest) request;   
      HttpServletResponse res = (HttpServletResponse) response;   
         
      HttpSession session = req.getSession();   
      String user = (String) session.getAttribute("currentSessionUser");   
      System.out.println("usuario logado =" +user);
      if(user!=null && user.trim().length()>0){   
         return;   
      }   
      res.sendRedirect("LoginPage.jsp");   
   }   
  
   public void init(FilterConfig arg0) throws ServletException {   
   }   
}

webXml

<filter>   
        <filter-name>FiltroSeguranca</filter-name>   
        <filter-class>br.controle.filtro.FiltroSeguranca</filter-class>           
    </filter>   
    <filter-mapping>   
        <filter-name>FiltroSeguranca</filter-name>   
       <url-pattern>/*</url-pattern>     
   <dispatcher>REQUEST</dispatcher> 
    </filter-mapping>

continua insistindo em dar mensagem de redirecionamento incorreto, ja criei pastas separadas e joguei as Jsp’s dentro e mudo no webXml e nada…

PArece que ele fica fazendo um looping no redirecinamento…

se eu separo por diretorios ele ate entra no sistema, mas qq tipo de acesso as paginas elas voltam em “branco”.

Ajuda ai que o trem ta feio gente… ja mudei o filtro N vezes tbm…

F

Seu filtro ta fazendo o redirect errado…
Coloca o BARRA na frente da pagina se não vc come o contexto da aplicação!!!
res.sendRedirect("/LoginPage.jsp"); -> vai gerar o endereço = localhost:8080/contexto/LoginPage.jsp -> Veja ai se tem essa pagina nesse lugar…

L

entao Fernando

coloquei a barra e olha o caminho q ele me retorna: eu tinha visto essa parada antes tbm…

http://localhost:8080/LoginPage.jsp

ele some com o caminho do “Contexto” ou aplicacao…

to implicado com 2 coisas,

a configuracao no webXml e esse redirect que o filtro faz…

ou ele ta redirecionando errado ou aquela <url-pattern>/*</url-pattern> esta errado.
mas por exemplo se coloco dentro de um diretorio da na mesma…

F

Acabei de ler aqui especificação aqui…eu passei a informação errada mesmo…me desculpe.
O redirect faz o endereço relativo mesmo, então pode acontecer…para impedir esse comportamento vc pode usar o endereço absoluto dinamico…veja um exemplo:

res.sendRedirect(request.getContextPath() + "/login.jsp");

getContextPath() -> retorna o endereço completo até o contexto ->"http://server:porta/contexto" + dai vc concatena oq precisar…

L

coloquei da usa forma ele pede pra fazer um "cast"

ficou assim:
res.sendRedirect(((HttpServletRequest) request).getContextPath() + "/LoginPage.jsp");

e no browser ao executar fala que :

O Firefox detectou que o pedido para este endereço não será concluído devido à forma que o servidor o está redirecionando.

ta tenso... e as estruturas de pastas minha estao assim:

Projeto\webcontent\aqui soltas estao minhas jsp's

algum comentario?

[img][/img]

F

Vc ta fazendo redirecionamento recursivo…veja seu patter = <url-pattern>/*</url-pattern> kkkk aonde vc resolve?? ja te dei as dicas das paginas…

L

como assim? explica pra nois novato hehehehe

F

Novato precisar ler um livrinho antes de se aventurar no servlet e jsp não acha? kkkk

L

que nada … sou adepto das praticas… exemplos… Por exemplo… vc que ja é um veterano… passando seus conhecimentos ja da pra eu sacar muito mais rapido…

pintou erro, os mano do guj ajuda… no final mais conhecimento adquirido… rsrsr…

Mas de toda forma vou procurar saber disso ai que tu disse… redirecionamento recursivo…

vou mudar as estruturas de pastas DE NOVO e irei testar… eu ja havia mudado antes e voltava no mesmo erro… vou ver qual cagadinha eu tinha feito antes…

pod ver que na imagem anexa tem uma pasta chamada “paginas”…

tava tudo la e o LoginPage.jsp de fora .,…

Qdo acessava as paginas de dentro ficavam em “branco”…

F

kkk ok ok…seu erro é simples…vc ta filtrando tudo…ou seja…a logica ta errada!!! ja te dei a dica…cria 2 pastas e filtro uma só…na outra deixa publico…

L

Problema resolvido.

antes mesmo seguindo as dicas do Fernando, estava dando errado, mas era falha minha mesmo…

separei os diretorios,

e quando eu rodava a aplicacao, eu estava esquecendo de colocar no endereco, a pasta para qual eu quero filtrar…

ex: http://localhost:8080/aplicacao/PASTA/LoginPage.jsp

dai por isso das paginas em branco igual mencionei la em cima…

Fica so mais uma pergunta:

com esse filtro, seja qualquer pagina que eu acesse dentro da aplicacao, mesmo ja tendo passado pelo login.jsp, ele ira ficar validando sempre o usuario? Vejo sempre na saida do console ele “printando”: “usuario = fulano” etc…

Muito obrigado Fernando pela ajuda e desculpa qq coisa…

Ah e prometo ler alguns livrinhos… kkkkkkkkk :slight_smile:

F

Sim…esse é justamente o objeto do filtro! Qualquer tentativa de acesso HTTP para recursos na sua solução sem estar logado o filtro bloqueia. Não deixe logs…

Criado 3 de novembro de 2011
Ultima resposta 4 de nov. de 2011
Respostas 16
Participantes 2