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.