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

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

新規登録して質問してみよう
ただいま回答率
85.50%
servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

2回答

7921閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2016/04/22 00:34

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; }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2016/04/22 01:30

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

java

1boolean judge = false; // 判定 2 3// 略 4 5while (rs.next() && judge == true) { 6 7}

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

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

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

java

1protected boolean authUser(String user, String pass) { 2 3 // DBの読み込み 4 try { 5 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 6 conn = DriverManager.getConnection(url, user_name, user_pass); 7 stmt = conn.createStatement(); 8 sql = "SELECT * FROM MANAGER"; 9 rs = stmt.executeQuery(sql); 10 11 // 判定 12 while (rs.next()) { 13 String name = rs.getString("ID"); 14 String password = rs.getString("PASSWORD"); 15 if (name.equals(user) && pass.equals(password)) { 16 return true; 17 } 18 } 19 20 } catch (ClassNotFoundException e) { 21 e.printStackTrace(); 22 } catch (Exception e) { 23 e.printStackTrace(); 24 } finally { 25 if (rs != null) { 26 try { 27 rs.close(); 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 } 32 33 if (stmt != null) { 34 try { 35 stmt.close(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 } 40 41 if (conn != null) { 42 try { 43 conn.close(); 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 return false; 50}

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

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

投稿2016/04/22 01:27

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問