Ajuda com Login + Filtro

2 respostas
L

Pessoal, inicialmente desculpa pelo post longo, mas quero criar um passo a passo de como criar uma tela de login validando usuário no banco de dados. Fui buscando informações na net e em livros e cheguei nessa proposta abaixo que falta pouco para funcionar.

Estou usando PostgreSQL, Tomcat 5.5, Eclipse + Plugin Tomcat e Amatera

Primeiro passo, criei uma tabela chamada usuario e inseri um registro com campo login=admin e senha=123456 . Segue estrutura do banco:

CREATE TABLE usuario
(
  id serial NOT NULL,
  "login" character varying(8) NOT NULL,
  senha character varying(32) NOT NULL,
  nm_usuario character varying(100) NOT NULL,
  CONSTRAINT usuario_pk PRIMARY KEY (id),
  CONSTRAINT login_uk UNIQUE ("login")
)

Segundo passo criei uma página index.jsp com o seguinte código:

<html>
  <body>
    <form action="logon" method="post">
      <input name="next" value="<%=request.getParameter("next")%>" type="hidden"/>
      <table align="center" border="1" cellpadding="4" width="50%">
      	<tr>
      	  <td colspan="2" align="center">Web Agenda</td>
      	</tr>
        <tr>
          <td align="right" width="50%">Login:</td>
          <td align="left"><input name="username" type="text"></td>
        </tr>
        <tr>
          <td align="right" width="50%">Senha:</td>
          <td align="left"><input name="password" type="password"></td>
        </tr>
        <tr>
          <td colspan="2" align="center">
            <input value="Entrar" type="submit">
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>

O action do form manda para logon cujo mapeamento está no web.xml, veja código abaixo:

<?xml version="1.0" encoding="ISO-8859-1"?>
	<webapp xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4">
		<displayname>Agenda Web</displayname>
		<welcomefilelist>
			<welcomefile>index.jsp</welcomefile>
		</welcomefilelist>
		<filter>
		    <filter-name>SecurityFilter</filter-name>
		    <filter-class>appl.security.SecurityFilter</filter-class>
		</filter>
		<filter-mapping>
		    <filter-name>SecurityFilter</filter-name>
		    <url-pattern>/*</url-pattern>
		</filter-mapping>
		<servlet>
		    <servlet-name>LogonServlet</servlet-name>
			<servlet-class>appl.security.LogonServlet</servlet-class>
		</servlet>
		<servlet-mapping>
		    <servlet-name>LogonServlet</servlet-name>
		    <url-pattern>/logon</url-pattern>
		</servlet-mapping> 
		<servlet>
		    <servlet-name>LogoffServlet</servlet-name>
		    <servlet-class>appl.security.LogoffServlet</servlet-class>
		</servlet>
		<servlet-mapping>
			<servlet-name>LogoffServlet</servlet-name>
			<url-pattern>/logoff</url-pattern>
		</servlet-mapping>
	</webapp>

Terceiro passo criei um ConnectionFactory, segundo o código da classe abaixo:

package appl.factory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionFactory {
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName("org.postgresql.Driver");
			String url = "jdbc:postgresql://localhost/dwbd";
			String usr = "postgres";
			String pss = "postgres";
			return DriverManager.getConnection(url, usr, pss);
		} catch (ClassNotFoundException e){
			throw new SQLException(e.getMessage());
		}
	}
}

Quarto passo criei um bean para Usuario e um DAO para o mesmo.

O Bean:

package appl.pojo;

public class Usuario {
	int id;
    String login;
	String senha;
	String nm_usuario;
	
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public String getNm_usuario() {
		return nm_usuario;
	}
	public void setNm_usuario(String nm_usuario) {
		this.nm_usuario = nm_usuario;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}

Agora o DAO.

package appl.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import appl.factory.ConnectionFactory;
import appl.pojo.Usuario;

public class UsuarioDAO {

	private Connection connection;
	
	public UsuarioDAO(){
		try {
			this.connection = ConnectionFactory.getConnection();
		} catch (Exception e){
			connection = null;
		}
		
	}
	
	public Usuario buscarContatoByLogin(String login, String senha){
		Usuario usuario = new Usuario();;
		try {
			PreparedStatement stmt = 
				connection.prepareStatement("select id, login, nm_usuario from usuario where login=? and senha=?");
			stmt.setString(1, login);
			stmt.setString(2, senha);
			ResultSet rs = stmt.executeQuery();
			while (rs.first()) {
				usuario.setId(rs.getInt("id"));
				usuario.setLogin(rs.getString("login"));
				usuario.setNm_usuario(rs.getString("nm_usuario"));
			}
			rs.close();
			stmt.close();
			return usuario;
		} catch (Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
}

Quinto passo, criei a classe que servirá como filtro e uma classe para efetuar o logon,

O Filtro:

package appl.security;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Properties;

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;

public class SecurityFilter implements Filter {
	
	HashMap resources = null;
	
	public void init(FilterConfig config){}
	public void destroy() {	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("Aplicando filtro de autenticacao");
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        // busca indicador de que o usuario efetuou autenticacao
        String autenticado = (String)req.getSession().getAttribute("autenticado");
        // se não esta autenticado, pede autenticacao
        if ((autenticado == null) && (req.getRequestURI().indexOf("autenticacao") < 0 )) {
        	// vai para pagina de autenticação
            res.sendRedirect("index.jsp"); 
        } else {
            chain.doFilter(request, response); // aplica próximo filtro 
        }
	}

	

}

O servlet de logon:

package appl.security;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import appl.dao.UsuarioDAO;
import appl.factory.ConnectionFactory;
import appl.pojo.Usuario;

public class LogonServlet extends HttpServlet {

	Connection conn = null;
	UsuarioDAO usuarioDAO;
	
	public void service(HttpServletRequest request,
						HttpServletResponse response) throws ServletException, 
															 IOException{
		usuarioDAO = new UsuarioDAO();
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String next = request.getParameter("next");
		if (next == null || next.length() == 0) {
			next = "/index.jsp";
		}
		Usuario usuario = usuarioDAO.buscarContatoByLogin(username, password);
		if (usuario != null) {
			request.getSession().setAttribute("autenticacao", usuario);
			response.sendRedirect(next);
		} else {
			response.sendRedirect("home.jsp?next=" + next + "&fail=1");
		}
	}
}

Aparentemente tudo certo, só que ao submeter o formulário ele não está redirecionando, o que leva a crer que não está funcionando a autenticação. Gostaria de sugestões de melhoria nesse código e nesse método de utilizar autenticação.

2 Respostas

Javabuntu

coloca ai a exceção lançada…

L

Esse é o problema, parece tudo certo, pois não lança exceção, acho que o problema está no web.xml pois ao clicar no botão Login ele manda para a página: http://localhost:8080/agenda/logon - onde logon seria a chamada a servlet ServletLogon que por sua vez passaria pelo filtro.

Criado 6 de abril de 2008
Ultima resposta 7 de abr. de 2008
Respostas 2
Participantes 2