0

请我对我的 ConnectLogin 和我的 ServletValidLogin 有一些疑问:我的 ConnectLogin

    package br.com.cad.dao;

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

import br.com.cad.basica.Contato;
import br.com.cad.dao.ConnectDb;

public class ConnectLogin extends ConnectDb {

    public Contato getContato( String email, String senha ){

        Connection c = this.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{


            ps = c.prepareStatement("select pf_email, pf_senha from dados_cadastro where pf_email = ? and pf_senha = ?");
            ps.setString(1, email);
            ps.setString(2, senha);

            rs = ps.executeQuery();

            if ( rs.next() ){
                Contato user = new Contato();
                user.setEmail(email);
                user.setSenha(senha);
                user.setNome( rs.getString("pf_nome") );

                return user;
            }
        }
        catch (SQLException e){
            e.printStackTrace();
        }
        finally{
            if (rs != null ) {
                try { rs.close(); } catch (SQLException e) { ; }
                rs = null;
            }
            if (ps != null ) {
                try { ps.close(); } catch (SQLException e) { ; }
                ps = null;
            }
            if (c != null ) {
                try { c.close(); } catch (SQLException e) { ; }
                c = null;
            }
        }
        return null;
    }
}

我的小服务程序:

package br.com.cad.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import br.com.cad.dao.ConnectLogin;
import br.com.cad.basica.Contato;

public class ServletValidaLogin extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
                         throws ServletException, IOException{

        HttpSession session = request.getSession(); 
        Contato user = null;
        String email = request.getParameter("email"); 
        String senha = request.getParameter("password"); 

        try {
            ConnectLogin dao = new ConnectLogin(); 
            user = dao.getContato(email, senha);
        }
        catch ( Exception e ){

        }


        if ( user == null ) {
            session.invalidate();
            request.setAttribute("msg", "Usuário ou senha inválidos");
            request.getRequestDispatcher("login.jsp" ).forward(request, response);
        }
        else{

            session.setAttribute("user", user);
            request.getRequestDispatcher("home.jsp" ).forward(request, response);
        }

    }

}

还有我的 ConnectDb:

    package br.com.cad.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class ConnectDb {  

    public Connection getConnection() {  
        try {  
            System.out.println("Connect to database...");  
            return DriverManager.getConnection("jdbc:mysql://localhost:3306/soa", "root", "wey123");  
        } catch(SQLException sqlException) {  
            throw new RuntimeException(sqlException);  
        }  
    }

我不知道出了什么问题以及为什么在我的控制台中返回:连接到数据库...在我的网页中返回的用户和​​密码无效!我认为问题出在我的 ConnectLogin 上,但是什么?

4

2 回答 2

0

您的“错误”可能是两件事之一。可能是您甚至没有连接到数据库。在ConnectDb.java你抛出一个RunTimeExceptionServletValidaLogin.java你正在吞下那个异常。System.out.println(e.getMessage())在块中添加一个catch以确保您确实能够连接。

try {
    ConnectLogin dao = new ConnectLogin(); 
    user = dao.getContato(email, senha);
}
catch ( Exception e ){
    System.out.println(e.getMessage()); 
}

在这种情况下会发生的是,由于您没有连接,您将进入catch块,然后您的if语句在ServletValidaLogin

if ( user == null )  

将评估为true,您将看到您的错误消息。旁注:您在没有输出/记录任何异常的情况下捕获了很多异常。您应该考虑println在所有这些中添加语句。这将使您更容易调试。

如果您能够连接,则可能是您ResultSet在执行查询后没有指向任何内容。如果是这种情况,if ( rs.next() )将评估为falseinConnectLogin.java并且您的方法将返回null而不是用户。可能是你有一个错误的查询(虽然不确定你是否应该收到一条错误消息,我很长时间没有使用普通的 JDBC)。在任何情况下,直接访问 mysql 并添加一个假用户并尝试对该假用户进行查询。如果你能找到他,那么你的问题可能出在你的插入中(好吧,所以 3 个可能的原因)。

更新

您的实际问题似乎是您在getRequest密码方法中引用了错误的名称。我们确定namefor 属性<input>实际上是senha并进行了必要的更改。

注意: 代替

user.setEmail(email);
user.setSenha(senha);

它应该是

user.setEmail(rs.getString("pf_email"));
user.setSenha(rs.getString("pf_senha"));

(尽管由于您的if情况并非完全必要,但将它们设置为查询返回的内容更有意义......至少对我而言)。

还,

user.setNome( rs.getString("pf_nome") );

甚至不应该在这里,因为它不在您的 select 语句中。

最后(与您的主要问题无关),您应该认真考虑同步 HttpSession. 它不是线程安全的。如果您想知道原因,可以阅读下面的答案以开始使用。网上还有很多文章讨论这个问题。

HttpSession 线程安全吗,设置/获取属性线程安全操作吗?

于 2013-07-10T05:50:12.543 回答
0

我会研究 Spring 和Spring Security,Spring 提供了经过良好测试的系统来保护网站和管理数据库连接。

目前它支持 DB 支持、JNDI 支持的安全性,或者您可以只对用户和角色进行硬编码。使用 spring,您可以仅保护站点或方法的部分

这是有关安全性本身的更多信息http://static.springsource.org/spring-security/site/tutorial.html

于 2013-07-09T23:23:07.547 回答