Sistema de login

E ae pessoal blz

Eu estou estudando java e montei um programinha básico para testar o que já aprendi, o programinha tem um index.jsp que pede usuário e senha, tem uma class de conexão,Interface e DAO. Quando o usuário digita o usuario e senha o sitema exibe os dados dele em outra JSP. Aí comecei a estudar alguns tutoriais para fazer com que meu login tenha filtros com sessão, porque até agora esta da seguinte forma se o cara digita os dados certos o sistema exibe os dados na JSP se digita errado ele simplesmehte deixa a jsp em branco. O problema é que não estou conseguindo desenvolver o sistema login. Já entendi como criar a sessão, mas não consegui montar um login filtrando como mando o figurino, ou seja digitou os dados certos acessa, digitou errado da a msn de acesso negado.
Será que algu poderia me explicar para mim como montar? Já estudei uns tutoriais mas não estou conseguindo entender.

Valeu

procure por servlet filter… Aqui no guj tem um bom tutorial sobre o assunto.

Caro Alexandre,

Segundo a especificação Java EE, é possível vc tratar das autenticações de uma maneira muito simples através do container JEE (como Tomcat por exemplo). Vc poderia sim utilizar Servlet Filter como sugeriu Tecnoage, porém na minha opnião, eu recomendaria deixar o container trabalhar com este tipo de processamento uma vez que o mesmo encapsula de uma forma mais segura e madura todos os processos de autenticação e autorização sendo que vc não precisaria se preocupar com uma linha se quer de código. Muito provavelmente deve existir no forum algum tópico referente aos passo-a-passo desta técnica. Caso não encontrar, vc me fala que tento exemplificar de uma forma mais detalhada.

Abraços,

Alexandre

E ae blz
Esse modo que vc mensionou parece ser bom também mas a critério de estudo eu gostaria de aprender os dois mas gostaria primeiro de aprender usando sessões e filtros.
Eu comecei montando o meu programa por partes, primeiro fiz o simples crieu uma página index.jsp que pede usuário e senha essa página manda a informação para um servlet que captura os dados e manda para uma interface de usuários que valida os dados e envia para o DAO que faz a conexão com banco de dado e por fim exibe em outra JSP, porém não estou conseguindo colocar os filtros para validar o login, por exemplo se o cara digita os dados certos é exibido os dados dele no jsp, se digita errado ele simplesmente exibe a jsp vazia.
Estudei o alguns tutoriais mas não estou conseguindo aplicar no meu projeto.
Olha como ele esta:

index.jsp

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

    <h1>JSP Page</h1>
    <br/>
    <form method="POST" action="Home.do">
        
        nome: <input type="text" name="nome">&nbsp;&nbsp<input type="submit" value="Consultar">
    </form>  
   
    </body>
</html>

ValidaUsuario.class

/*
 * ValidaUsuario.java
 *
 * Created on 17 de Julho de 2007, 22:04
 */

package Validacao;


import DAO.DAOUsuario;
import java.io.*;
import java.net.*;
import java.sql.SQLException;

import javax.servlet.*;
import javax.servlet.http.*;

import Interfaces.InterfaceUsuario;

/**
 *
 * @author alexandre
 * @version
 */
public class ValidaUsuario extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    
    private String nome;
    private String usuario;
    private int erro;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, SQLException 
    {
    
        nome = request.getParameter("nome");
      //  System.out.println("nome teste :" + nome);
        InterfaceUsuario validar = new InterfaceUsuario();
        
        validar.setNome(nome);
        erro = validar.getErro();
        
          
        if(erro == 0)
        {
     
          DAOUsuario resultado = new DAOUsuario();
          resultado.setNome(nome);
          
          request.setAttribute("usuario",resultado);
         // request.setAttribute("lista",resultado);
          
          RequestDispatcher view = request.getRequestDispatcher("home.jsp");
          view.forward(request,response);
        }
        else
        {
            System.out.println("Erro aqui");            
        }
        
        
    }
    
}

InterfaceUsuario

/*
 * InterfaceUsuario.java
 *
 * Created on 17 de Julho de 2007, 22:07
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package Interfaces;

/**
 *
 * @author alexandre
 */
public class InterfaceUsuario 
{
    
    private String nome;
    private int erro = 0;
    /** Creates a new instance of InterfaceUsuario */
    public InterfaceUsuario() 
    {
   
    }
    
    public void setNome(String Nome)
    {
     this.nome = Nome;   
     
     if(nome.length()<1)
     {
         erro = 1;
     }
     
    }
    
    public String getNome()
    {
        return nome;
    }
    
    public int getErro()
    {
        return erro;
    }
    
}

Classe de array

/*
 * ClassArray.java
 *
 * Created on 27 de Agosto de 2007, 21:46
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package Interfaces;

/**
 *
 * @author alexandre
 */
public class ClassArray 
{
    private String nome;
    private String cargo;
    private String usuario;
    private String senha;
    
    
    public String getNome()
    {
        return nome;
    }
    
    public void setNome(String nome)
    {
        this.nome = nome;
    }
    
    public String getCargo()
    {
        return cargo;
    }
    
    public void setCargo(String cargo)
    {
        this.cargo = cargo;
    }
    
    public String getUsuario()
    {
        return usuario;
    }
    
    public void setUsuario(String usuario)
    {
        this.usuario = usuario;
    }
    
    public String getSenha()
    {
        return senha;
    }
    
    public void setSenha(String senha)
    {
        this.senha = senha;
    }
}

DAO

/*
 * DAOUsuario.java
 *
 * Created on 17 de Julho de 2007, 22:18
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package DAO;


import java.io.*;
import java.net.*;
import java.util.*;

import java.sql.*;

import conexao.Conexao;
import Interfaces.ClassArray;

  

/**
 *
 * @author alexandre
 */
public class DAOUsuario 
{
    private String nome;
    private String usuario;
    
    private ResultSet rs;
    private Connection conn;
    private Statement sql; 

    //private ArrayList lista;
    /** Creates a new instance of DAOUsuario */
    public DAOUsuario() throws SQLException, IOException
    {
     conn = Conexao.connect();
    }
    
    public void setNome(String aNome) throws SQLException, IOException
    {
     nome = aNome;
     
      PreparedStatement  sql = conn.prepareStatement("select * from senhadeals where usuario = ?");
      sql.setString(1,nome);
      
     rs = sql.executeQuery();
      
      while(rs.next())
      {
        usuario = rs.getString("nome");
      }
     
     
     
    }
    
    public  List getLista() throws SQLException
    {
        PreparedStatement sql = conn.prepareStatement("select * from senhadeals");
        rs = sql.executeQuery();
        
        List lista = new ArrayList();
        
        while(rs.next())
        {
            lista.add(rs.getString("nome"));
        }
        
        return lista;        
        
    }
    
    public List getDados() throws SQLException
    {
        PreparedStatement sql = conn.prepareStatement("select * from senhadeals");
        rs = sql.executeQuery();
        
        List dados = new ArrayList();
        ClassArray array;
        while(rs.next())
        {
            array = new ClassArray();
            array.setNome(rs.getString("nome"));
            array.setCargo(rs.getString("cargo"));
            array.setUsuario(rs.getString("usuario"));
            array.setSenha(rs.getString("senha"));
            
            dados.add(array);
        }
        
        return dados;
    }
    
    
    
    public String getUsuario()
    {
        return usuario;
    }
    
    
    
}

Conexão

/*
 * Conexao.java
 *
 * Created on 17 de Julho de 2007, 21:58
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package conexao;

/**
 *
 * @author alexandre
 */
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



/**
 *
 * @author alexandre
 * @version
 */
public class Conexao {
 	
 	private static String NAME	= "com.mysql.jdbc.Driver";
 	private static String URL	= "jdbc:mysql://localhost/fidelity";
 	private static String LOGIN	= "root";
 	private static String PASS	= "";
        private static Connection conn;
 	
 	/**
 	 * 
 	 * @return Conexao.
 	 * @throws SQLException
 	 * @throws IOException
 	 */
 	public static Connection connect() throws SQLException, IOException {
 		
 		//Connection conn = null;
           
 		
 		try {
 			Class.forName(NAME);
 			conn = DriverManager.getConnection(URL, LOGIN, PASS);
 		} 
                catch (ClassNotFoundException e) 
                {
 			System.out.print("\nNão foi possível estabelecer conexão com a base de dados.\n");
 			e.printStackTrace();
 			return null;
 		}
 		return conn;
 	}
 }

Essa é a JSP que exibe os resultados:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

    <h1>JSP Page<br></h1>

        String de nome simples: <font color="red"> ${usuario.usuario} </font><br>
        <br>
        exemplo de List 1:<font color="blue">
            <table>
                <c:forEach var="nomes" items="${usuario.lista}">
                    <tr>
                        <td>${nomes}</td>
                    </tr>
                    
                </c:forEach>
        </table></font><br><br>
          exemplo de List 2:<font color="blue">
            <table>
          <c:forEach var="detalhes" items="${usuario.dados}">
                    <tr>
                        <td><c:out value="${detalhes.nome}" /> <c:out value="${detalhes.cargo}" /> <c:out value="${detalhes.usuario}" /> <c:out value="${detalhes.senha}" /></td>
                    </tr>
                    
          </c:forEach>
        </table>
    </body>
</html>

O XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   
    <context-param>
        <param-name>com.sun.faces.validateXml</param-name>
        <param-value>true</param-value>
    </context-param>
   
    <servlet>
        <servlet-name>ValidaUsuario</servlet-name>
        <servlet-class>Validacao.ValidaUsuario</servlet-class>        
    </servlet>
    
    <servlet-mapping>
        <servlet-name>ValidaUsuario</servlet-name>
        <url-pattern>/Home.do</url-pattern>
    </servlet-mapping>    
</web-app>

Tentei muito e não consegui colocar o esquema de sessão nesse código! Será poderia me dar um força e me expĺicar como eu coloco um filtro com sessão para deixar esse login funcionando corretamente?

Valeu pela força

Estive dando uma olhada no exemplo que postou e o que fez até o momento não foge muito do real. Existem sim alguns errinhos ali e aqui, que tentarei te mostrar criando um exemplo prático do zero (sem implementar DAO). Dois erros que notei de cara primeiro foi que voce nao criou nenhuma classe que implemente a interface Filter (o filtro propriamente dito) nem tao pouco a declarou no seu web.xml. Bom, vamos ver como ficaria entao este exemplo:

1o Passo - Definir o layout da pagina de login

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Exemplo de Filtro - Login Page</h1>
        ${mensagem}
        <form action="login" method="post">
            <table>
                <tr>
                    <td><label for="idUsername">Usuario:</label></td>
                    <td><input type="text" id="idUsername" name="txtUsername"></td>
                </tr>
                <tr>
                    <td><label for="idPassword">Senha:</label></td>
                    <td><input type="password" id="idPassword" name="txtPassword"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="Enviar Dados"></td>
                </tr>
            </table>
        </form>
    </body>
</html>

2o Passo - Definir a classe que represente o login (Javabean);

/*
 * Login.java
 *
 * Created on October 23, 2007, 10:57 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.com.testando.filtro.model;

import java.io.Serializable;

/**
 *
 * @author Alexandre
 */
public class Login implements Serializable {
    
    private String username;
    private String password;
    
    /** Creates a new instance of Login */
    public Login() {
    }
    
    public Login(String username, String password) {
        setUsername(username);
        setPassword(password);
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
}

3o Passo - Definir o servlet que ira tratar da logica para realizar a validacao colocando-se assim um objeto na Session para validacao final no filtro

/*
 * LoginServlet.java
 *
 * Created on October 23, 2007, 10:51 PM
 */

package br.com.testando.filtro.servlet;

import br.com.testando.filtro.model.Login;
import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 *
 * @author Alexandre
 * @version
 */
public class LoginServlet extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        String usuario = request.getParameter("txtUsername");
        String senha = request.getParameter("txtPassword");
        
        String mensagem = "";
        String urlDestino = "";
        String contexto = request.getContextPath();
        
        if ((usuario == null) || (usuario.equals(""))) {
            mensagem = "Usuario invalido. Favor digitar novamente.";
            urlDestino = "/index.jsp";
        } else if ((senha == null) || (senha.equals(""))) {
            mensagem = "Senha invalida. Favor digitar novamente.";
            urlDestino = "/index.jsp";
        } else {
            if (usuario.equals("testando") && (senha.equals("filtro"))) {
                Login login = new Login(usuario, senha);
                HttpSession session = request.getSession();
                session.setAttribute("login", login);
                mensagem = "Usuario autenticado!";
                urlDestino = "/restrict/main.jsp";
            } else {
                mensagem = "Usuario e senha invalido!!!";
                urlDestino = "/index.jsp";
            }
        }
        
        request.setAttribute("mensagem", mensagem);
        RequestDispatcher rd = request.getRequestDispatcher(urlDestino);
        rd.forward(request, response);
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
}

4o Passo - Declarar a classe que implemente Filter

/*
 * LoginFilter.java
 *
 * Created on October 23, 2007, 11:10 PM
 */

package br.com.testando.filtro.filter;

import br.com.testando.filtro.model.Login;
import java.io.*;
import javax.servlet.*;

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.HttpServletResponse;

/**
 *
 * @author  Alexandre
 * @version
 */

public class LoginFilter implements Filter {
    
    public void init(FilterConfig config) throws ServletException {
        
    }
    
    // The filter configuration object we are associated with.  If
    // this value is null, this filter instance is not currently
    // configured.
    private FilterConfig filterConfig = null;
    
    /**
     *
     * @param request The servlet request we are processing
     * @param result The servlet response we are creating
     * @param chain The filter chain we are processing
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet error occurs
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletRequest req = (HttpServletRequest)request;
        Login login = (Login)req.getSession().getAttribute("login");
        if (login != null) {
            chain.doFilter(request, response);
        } else {
            HttpServletResponse res = (HttpServletResponse)response;
            res.sendRedirect(req.getContextPath() + "/index.jsp");
        }
        
    }

    public void destroy() {
    }
}

5o Passo - Configurar o arquivo web.xml indicando qual o filtro vc esta utilizando para realizar autenticacao

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>br.com.testando.filtro.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/restrict/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>br.com.testando.filtro.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
	<welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

6o e ultimo passo - Definir a pagina com acesso “administrativo” (autenticado)

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

    <h1>Exemplo de Filtro - Pagina restrita ao usuario logado</h1>
    ${mensagem}
    
    </body>
</html>

Acho que isso eh tudo. Nao vou comentar linha a linha, senao ficaria muito grande esta mensagem. Da uma boa analisada neste codigo que postei e tente entender mais ou menos o que acontece por de tras dos bastidores. Se ainda tiver alguma duvida, pode perguntar que irei te responder.

Abracos,

E a e blz

Legal cara valeu mesmo esse exemplo que vc deixou é muito bom! vou estudar ele e tentar montar um programa pra treinar se eu travar eu posto minha dúvida se conseguir eu posto o que eu fiz.

at+

E ae Alexmdo blz cara

Então estou estudando o seu código e estou entendendo bem, vc explicou de uma forma bem clara é o que eu precisa já estou montando algo aqui.
Porém estudando o seu código fiquei com um pouco de dúvida nessa parte da class LoginFilter:

 public void doFilter(ServletRequest request, ServletResponse response,  
             FilterChain chain)  
             throws IOException, ServletException {  
           
         HttpServletRequest req = (HttpServletRequest)request;  
         Login login = (Login)req.getSession().getAttribute("login");  
         if (login != null) {  
             chain.doFilter(request, response);  
         } else {  
             HttpServletResponse res = (HttpServletResponse)response;  
             res.sendRedirect(req.getContextPath() + "/index.jsp");  
         }  
           
     }  

Na verdade minha dúvida esta no seguinte, essa linha:
HttpServletRequest req = (HttpServletRequest)request;
Cria uma varialvel que recebe algo do cabeçalho http, se entendi bem.
E essa linha:
Login login = (Login)req.getSession().getAttribute(“login”);
Sei que ela implementa a class Login mas esse pedaço dessa linha não estou conseguindo entender:
(Login)req.getSession().getAttribute(“login”)
vc poderia me explicar o que faz essa parte?

Mas desde já cara agradeço mais uma vez por essa força que vc esta me dando.

E ae pessoal blz

Então alguém poderia me dar um help nessa última dúvida que postei?

Valeu galera

E ae pessoal blz

Bom estou estudando e desenvolvendo os filtros e estou conseguindo fazer, só essa parte que deixei na minha última pergunta que eu queria entender melhor, que no caso é essa parte que deixei acima:

[quote]
Na verdade minha dúvida esta no seguinte, essa linha:
HttpServletRequest req = (HttpServletRequest)request;
Cria uma varialvel que recebe algo do cabeçalho http, se entendi bem.
E essa linha:
Login login = (Login)req.getSession().getAttribute(“login”);
Sei que ela implementa a class Login mas esse pedaço dessa linha não estou conseguindo entender:
(Login)req.getSession().getAttribute(“login”)
vc poderia me explicar o que faz essa parte? [/quote]

Alguém pode me explicar por favor? Valeu pessoal

Primeiro pega o objeto de requisição(request) pegando o atributo login da sessão(vindo do request) por isso do Cast para Login.Um Filtro é como uma camada que vai sendo executada depois da outra, não tem mistério.

Alexmdo, isso é quase um tutorial! :smiley: