質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.31%

Servlet でのログイン処理について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 6,686
退会済みユーザー

退会済みユーザー

Servletにて、ログイン画面を作成しておりますが、
うまくできません。
どこを修正するべきか、教えていただけないでしょうか?

ORACLEのデータベースの表一覧に一致するものがあれば、
ログインできるようにしていますが、
一致する値を入力してもログインできません。

例)

ID    PASSWORD

a    a
bb    bb
ccc    ccc
dddd    dddd
eeeee    eeeee

trueを返すことでログインでき、
falseを返すことで失敗となるようにしていますが、

/**
     * ログインの判定
     *
     * @param user
     *            ユーザ名
     * @param pass
     *            パスワード
     * @return
     */
    protected boolean authUser(String user, String pass) {

        boolean judge = false; // 判定
        // DBの読み込み
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            conn = DriverManager.getConnection(url, user_name, user_pass);
            stmt = conn.createStatement();
            sql = "SELECT * FROM MANAGER";
            rs = stmt.executeQuery(sql);
        } catch (ClassNotFoundException e) {
            return judge;
        } catch (Exception e) {
            return judge;
        } finally {
            try {
                // 判定
                while (rs.next() && judge == true) {
                    String name = rs.getString("ID");
                    String password = rs.getString("PASSWORD");
                    if (name == user && pass == password) {
                        judge = true;
                    } else {
                        judge = false;
                    }
                }
                rs.close();
                stmt.close();
                conn.close();
            } catch (SQLException e) {
            }
        }
        return judge;
    }

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

boolean judge = false; // 判定 

// 略

while (rs.next() && judge == true) { 

}

while に到達する間に、judge が true になることはありませんので、
永久に while に入ることはありません。
つまり、永久に judge が true になることがないため、ログインできないのでしょう。

あと、判定処理を finally で行っているのもおかしいです。
try句 で例外が起きてしまった場合、conn とか stmt とか rs とか null になると思うので、
NullPointer になると思いますよ。

if (name == user && pass == password)
Javaでは、文字列比較に == を使ってはいけません。

protected boolean authUser(String user, String pass) {

    // DBの読み込み 
    try { 
        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
        conn = DriverManager.getConnection(url, user_name, user_pass); 
        stmt = conn.createStatement(); 
        sql = "SELECT * FROM MANAGER"; 
        rs = stmt.executeQuery(sql); 

        // 判定 
        while (rs.next()) { 
            String name = rs.getString("ID"); 
            String password = rs.getString("PASSWORD"); 
            if (name.equals(user) && pass.equals(password)) { 
                return true;
            } 
        } 

    } catch (ClassNotFoundException e) { 
        e.printStackTrace();
    } catch (Exception e) { 
        e.printStackTrace();
    } finally { 
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    } 
    return false; 
}

今はそのままにしてますが、本当は java.sql.Statement は
セキュリティの問題上使ってはいけません。

いかなる時も、java.sql.PreparedStatement を使うようにしてください。
prepareStatementの使用

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

SQLでデータを全部引っ張ってきてfor文でグルグル判定させるのはメモリの無駄になってしまうかと。

「画面から入力されたIDとパスワードを、SQL文のwhere句に指定して、取得できなかったらエラー」
という方が処理も早いです。

で、値の判定なのですが、==の判定はjavaでは同じインスタンスかどうかの判定になります。
同じ値かどうかの判定にはequals()メソッドを使用してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.31%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る