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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

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

Q&A

解決済

1回答

1616閲覧

JSPでのログイン認証について

kumakumatan

総合スコア213

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

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

0グッド

0クリップ

投稿2018/10/09 02:11

Eclipseを利用してjspにてオラクルテーブルに接続し、画面に入力されたパスワード
を元に認証できるよう作成しているのですが、作成したものを見ると、

[Unhandled exception type ClassNotFoundException]
となってしまいます。
・/page/Login.jsp

jsp

1<%@ page 2contentType="text/html; charset=Windows-31J" 3import="org.apache.commons.lang.*" 4import="javax.servlet.http.HttpSession" 5 6import="java.io.*" 7import="javax.servlet.*" 8import="javax.servlet.http.*" 9import="java.sql.*" 10 11 12%> 13<%! 14 15private boolean doLogin(String userid, String pass) { 16 17 Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 18 19 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.138.122:1521:TEST", "tst", "tst"); 20 // ステートメントを作成 21 Statement stmt = conn.createStatement(); 22 // 問合せの実行 23 ResultSet rset = stmt.executeQuery("SELECT * FROM USER"); 24 // 問合せ結果の表示 25 26 27 // 判定 28 while (rset.next()) { 29 String name = rset.getString("USER_ID"); 30 String password = rset.getString("PASSWD"); 31 if (userid.equals(name) && pass.equals(password)) { 32 return true; 33 } else{ 34 return false; 35 } 36 } 37 38 39 return false; 40} 41%><% 42try { 43// セッションを無効化する 44session.invalidate(); 45} catch (IllegalStateException e) { 46//すでに無効化されたセッションの場合は無視する 47} 48//環境定数をあらかじめ取得 49String ctxPath = request.getContextPath(); 50String pAction = request.getParameter("action"); 51String userid = request.getParameter("user"); 52 53String password = request.getParameter("password"); 54 55if(StringUtils.equals(pAction, "dologin")) { 56//if( doLogin(userid) ) { 57//追加 58 if( doLogin(userid, password) ) { 59//追加 60 // セッションを作成する 61HttpSession sess = request.getSession(true); 62// ログイン済みフラグ 63sess.setAttribute("APP_ISLOGGEDIN",new Boolean(true)); 64// ログインユーザID 65sess.setAttribute("APP_USER",userid); 66 67//追加 68//ログインパスワード 69sess.setAttribute("APP_PASS",password); 70//ログインパスワード 71//追加 72 73// 初期入出力を表示する 74response.sendRedirect( ctxPath + "/"); 75return; 76} 77} 78%> 79<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 80<html> 81<head> 82<meta http-equiv="Pragma" content="no-cache"> 83<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 84<meta http-equiv="Content-Script-Type" content="text/javascript"> 85<meta http-equiv="Content-Style-Type" content="text/css"> 86<title>ログイン(Login.jsp)</title> 87<link rel="stylesheet" type="text/css" href="<%= ctxPath %>/style/global.css"> 88<link rel="stylesheet" type="text/css" href="<%= ctxPath %>/style/body_global.css"> 89<link rel="stylesheet" type="text/css" href="<%= ctxPath %>/style/login.css"> 90</head> 91<jsp:include page="/page/_H_login.jsp"/> 92<body> 93<h1>ログイン(Login.jsp)</h1> 94<form name="Login" method="POST" target="_self" action="<%= ctxPath %>/page/Login.jsp"> 95<input type="hidden" name="action" value="dologin"/> 96<img src="<%= ctxPath %>/image/mesage_info.gif" alt="MSG_INFO"/> 97ユーザIDとパスワードを入力後、ログインをクリックして下さい。<br /> 98<br/> 99<table border="0" align="left"> 100<tr> 101<th align="right">ユーザーID</th> 102<td> 103<input id="user" type="text" name="user" value="" maxlength="30" /> 104</td> 105</tr> 106<tr> 107<th align="right">パスワード</th> 108<td> 109<input id="pass" class="action" type="password" name="password" value="" maxlength="30" /> 110</td> 111</tr> 112<tr> 113<td colspan="2"> 114<input type="submit" id="submit" value="ログイン"/> 115</td> 116</tr> 117</table> 118</form> 119<jsp:include page="/page/_F_login.jsp"/> 120</body> 121</html>

おそらく、

java

1Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

の部分かと思われるのですが、どのように対処していいかわかりません。
呼出し元は
Login.java
「WEB-INF/src/test/Login.java」

java

1package test; 2import java.io.IOException; 3 4public class MyLoginFilter implements Filter { 567 8String LoginPage = req.getContextPath() + "/page/Login.jsp"; 91011// ログインしているための条件を判定します。 12if (!isLoggedIn.booleanValue()) { 13// 未ログインの場合、ログイン画面を表示 14if (!StringUtils.contains(req.getRequestURI(), LoginPage)) { 15res.sendRedirect(LoginPage); 16return; 17} 18 19}

「WEB-INF/lib/ojdbc8.jar」はあります。

初心者で、いろいろなサンプルを見て実装してみたのですが、どこが悪いのかわかりません。
ご教授宜しくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/10/09 02:31

おそらくもなにも、エラーにかいてあるでしょ不足のクラスが
kumakumatan

2018/10/09 04:26

Class.forNameの部分でしょうか?自分の場合、このような場合、どのように記述したら
kumakumatan

2018/10/09 04:26

よろしいでしょうか?宜しくお願いします。
guest

回答1

0

ベストアンサー

java

1Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

の部分は、いくつかのチェック例外に対する制御をしなければなりません。つまり現在のJSPはコンパイルエラーが発生しています。
少なくとも、

java

1private boolean doLogin(String userid, String pass)

の部分に、throws Exception を追加して、呼び出し部分でtry~catchすべきでしょう。

クラスが足りていないわけではありません。

投稿2018/10/09 04:41

A-pZ

総合スコア12011

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

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

kumakumatan

2018/10/09 07:09

ご回答ありがとうございます。 private boolean doLogin(String userid, String pass) throws SQLException, ClassNotFoundException{ try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.138.122:1521:TEST", "tst", "tst"); // ステートメントを作成 Statement stmt = conn.createStatement(); // 問合せの実行 ResultSet rset = stmt.executeQuery("SELECT * FROM USER"); // 問合せ結果の表示 // 判定 while (rset.next()) { String name = rset.getString("USER_ID"); String password = rset.getString("PASSWD"); if (userid.equals(name) && pass.equals(password)) { return true; } else{ return false; } } }catch(ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { } return false; } エラーはなくなったのですが、ユーザ、パスワードの入力値が正常な値を 入れても全て「false」になってしまいます。 tryの中での「Connection/Statement/ResultSet」 あたりに値がなく、認証ができなく全て一番最後に記載されている「return false;」 が返ってきてしまっていると思います。 途中の「Connection/Statement/ResultSet」の値に何が入っているのかデバックしたりする 方法はjspではどのようにするのでしょうか?画面表示でもできればありがたいです。 宜しくお願いします。
A-pZ

2018/10/10 02:02

JSPでのデバッグモードも、サーバ(Tomcat)をデバッグで起動し、JSP内でブレークポイントをつけるとそこで一時停止します。 while(rset.next()) の部分で、レコードがあれば検索結果を1件取得する処理になっていますが、肝心のSQL文が、SELECT * FROM USER と USERテーブルの内容を全件取得するものになっており、もしこれが2件以上取得できた場合、次のreturn trueやfalseで1件目の段階で処理が終了してしまいますので、SQL文の中で、ユーザーIDとパスワードの値を条件に検索するよう変更するのが良いでしょう。検索時にパラメータを渡す場合はPreparedStatementを使います。
kumakumatan

2018/10/10 03:00

ご回答ありがとうございます。 この場合「rset」に一致する値がある場合は if(rset > 0){ return true }else{ return false } というように分岐処理を記述すればよろしいでしょうか? 宜しくお願いします。
A-pZ

2018/10/10 03:57

> 0 では判定できませんが、単純に1件ヒットしたのかを返したいのであれば、ResultSetのnext() の結果が true または false を返すので、この結果を返せばよいでしょう。 なお、データベースの接続が閉じられていないので、処理が終わったら必ず ConnectionないしはStatementを閉じなければなりません。「Java SQL ResultSet」で検索するといくつか有効なサイトが見つかるでしょう。
kumakumatan

2018/10/10 04:48 編集

private boolean Login(String userid, String pass) throws SQLException, ClassNotFoundException{ try{ ・ ・ ・ String sql="SELECT * FROM USER where USER_ID=? and PASSWD=?"; //★仮のSQL文 PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1,userid); //★パラメータ(?の1番目)に実際の値を割り当て pstmt.setString(2,pass); //★パラメータ(?の2番目)に実際の値を割り当て ResultSet rset = pstmt.executeQuery(); while (rset.next()) { return true; } }catch(ClassNotFoundException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { //終了処理 if (rset != null) { try { rset.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; } これを実装したら、意図する事ができました。 eclipseで見ると、「if (rset != null) {」の 「rset」の部分が赤線表示になり、「rset を変数に解決できません」 と表示 されます。 この文字を消す事はできないのでしょうか? コンパイルできるようにするにはどうしたらいいでしょうか? 宜しくお願いします。
kumakumatan

2018/10/10 07:17

try{ の前に 「Connection conn = null;」 と定義する事でfinally {でもconnとして利用できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問