1

サーブレットからのログインクレデンシャルを解決するために、次のコードを処理しています。

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;

@WebServlet("/login")
public class oneServlet extends HttpServlet {

public static Connection getConnection() throws Exception {

    String driver = "org.postgresql.Driver";
    String url = "jdbc:postgresql://10.1.11.112:5432/pack";
    String username = "pack";
    String password = "pack";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    return conn;
    }

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

    String user=request.getParameter("t1");
    String pass=request.getParameter("t2");

    System.out.println("done 1");

    Connection conn = null;
    PreparedStatement pstmt = null;

    System.out.println("done 2");

    try {
         conn = getConnection();
         String queryTest = "select username,password from login ";
         pstmt = conn.prepareStatement(queryTest);

         System.out.println("done 3");

         ResultSet rs = pstmt.executeQuery();

         System.out.println("done4");

         while (rs.next()) {

         System.out.println("done5");    

         String username=rs.getString(1);
         String password=rs.getString(2);    

         if(user.equals(username) && pass.equals(password))
         {
             response.sendRedirect("LoginSuccess.jsp");
             return;

         }  
         else
         {
            JOptionPane.showMessageDialog(null, "retry");
         }
         }
         }

     catch (Exception e) {
        e.printStackTrace();
    }

    finally {
        try {
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
}

私が直面している問題は、「while(rs.next())」が反復され、テーブルで使用可能なすべてのユーザー名の出力を表示していることですが、リダイレクトまたは再試行のいずれかで、一度だけ表示する必要があります。任意の提案をいただければ幸いです。

4

5 に答える 5

4

DBが探している行を正確に返すような方法でSQLクエリを記述する代わりに、DBテーブル全体をJavaのメモリに不必要にコピーしているため、 if (resultSet.next()).

SQLWHERE句を使用します。

String query = "select username from login where username=? and password=?";
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

try {
    connection = getConnection();
    statement = connection.prepareStatement(query);
    statement.setString(1, user);
    statement.setString(2, pass);
    resultSet = statement.executeQuery();

    if (resultSet.next()) {
        response.sendRedirect("LoginSuccess.jsp");
    } else {
        request.setAttribute("message", "retry");
    }
} catch (SQLException e) {
    throw new ServletException("DB interaction failed", e);
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

メッセージを表示する非常識な方法も修正し、例外処理と DB リソースのクローズも修正したことに注意してください。はJOptionPane、メッセージを Web サーバーの画面にのみ表示し、Web ブラウザーの画面には表示しません。物理的に同じマシンで実行されていない場合、実際の運用環境ではもちろん失敗します。roseindia.net のチュートリアルを読まないことを強くお勧めします。そのサイトには、コードで公開されているような悪い習慣が散らばっています.

以下も参照してください。

于 2013-02-08T13:01:16.030 に答える
1

クエリを次のように変更します

String queryTest = "select username,password from login where username = ?";
pstmt = conn.prepareStatement(queryTest); 
pstmt.setString(1,user);

更新:より良い解決策は、必要なデータのみを取得するのではなく、(セキュリティの問題のために) DB からパスワードを取得しないことです。

于 2013-02-08T13:00:14.937 に答える
0

実行しているクエリは、すべてのユーザーに対してクエリを実行している特定のユーザー向けではありません。クエリにユーザー名とパスワードを追加するのを忘れていると思います。

ただし、これが 1 回反復する必要がある場合は、 while を if に置き換えて、1 回だけ反復します。

if (rs.Next){

       //your code

}
于 2013-02-08T12:59:57.570 に答える
-1
while (rs.next()) {

     System.out.println("done5");    

     String username=rs.getString(1);
     String password=rs.getString(2);    

     if(user.equals(username) && pass.equals(password))
     {
         response.sendRedirect("LoginSuccess.jsp");
         return;

     }  
     else
     {
        JOptionPane.showMessageDialog(null, "retry");
     }
break;
     }

これは正しい実装ではありませんが、問題を解決するはずです。

于 2013-02-08T12:56:43.123 に答える
-1

正しいユーザー名とパスワードを持つ結果のみを選択するようにクエリを作成します。

String queryTest = "select username,password from login where username=? and password=?";
PreparedStatement pstmt = conn.prepareStatement(queryTest);
pstmt.setString(1, user);    
pstmt.setString(2, pass);
于 2013-02-08T12:58:01.233 に答える