🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Tomcat

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

Q&A

2回答

3416閲覧

ユーザ認証でデータベースに登録されているデータを入力しても認証されない

javas

総合スコア5

Java

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

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Tomcat

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

0グッド

0クリップ

投稿2019/11/18 09:31

編集2019/11/19 05:57

前提・実現したいこと

ログイン画面から送られてきたユーザー名とパスワードでデータベース内のデータを照合してユーザーの認証を行います。
実際の処理としてはユーザー管理用のテーブルをユーザー名とパスワードが一致するレコードがあるかどうかを検索して、あれば認証する

発生している問題・エラーメッセージ

SQL文が間違っているわけでもなくエラーメッセージも
出力されていませんが、認証画面からデータベースに登録
されているデータを入力しても認証されません。

エラーメッセージが出ていないのでコンソールに出力された情報を入れます。 情報: Command line argument: -Dfile.encoding=UTF-8 情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

該当のソースコード

JavaEE

1import java.io.IOException; 2 3import javax.servlet.Filter; 4import javax.servlet.FilterChain; 5import javax.servlet.FilterConfig; 6import javax.servlet.ServletException; 7import javax.servlet.ServletRequest; 8import javax.servlet.ServletResponse; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11import javax.servlet.http.HttpSession; 12 13public class AuthFilter1 implements Filter{ 14 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ 15 try{ 16 String target = ((HttpServletRequest)request).getRequestURI(); 17 18 HttpSession session = ((HttpServletRequest)request).getSession(); 19 20 if (session == null){ 21 /* まだ認証されていない */ 22 session = ((HttpServletRequest)request).getSession(true); 23 session.setAttribute("target", target); 24 25 ((HttpServletResponse)response).sendRedirect("/auth/Login"); 26 }else{ 27 Object loginCheck = session.getAttribute("login"); 28 if (loginCheck == null){ 29 /* まだ認証されていない */ 30 session.setAttribute("target", target); 31 ((HttpServletResponse)response).sendRedirect("/auth/Login"); 32 } 33 } 34 35 chain.doFilter(request, response); 36 }catch (ServletException se){ 37 }catch (IOException e){ 38 } 39 } 40 41 public void init(FilterConfig filterConfig) throws ServletException{ 42 } 43 44 public void destroy(){ 45 } 46} 47

JavaEE

1import java.io.IOException; 2import java.io.PrintWriter; 3 4import javax.servlet.ServletException; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8import javax.servlet.http.HttpSession; 9 10public class CustomAuth1 extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws IOException, ServletException{ 14 15 response.setContentType("text/html; charset=UTF-8"); 16 PrintWriter out = response.getWriter(); 17request.setCharacterEncoding("UTF-8"); 18 19 String target = request.getRequestURI(); 20 21 HttpSession session = request.getSession(false); 22 23 if (session == null){ 24 /* まだ認証されていない */ 25 session = request.getSession(true); 26 session.setAttribute("target", target); 27 28 response.sendRedirect("/auth/Login"); 29 }else{ 30 Object loginCheck = session.getAttribute("login"); 31 if (loginCheck == null){ 32 /* まだ認証されていない */ 33 session.setAttribute("target", target); 34 response.sendRedirect("/auth/Login"); 35 } 36 } 37 38 out.println("<html>"); 39 out.println("<head>"); 40 out.println("<title>ユーザー認証テスト</title>"); 41 out.println("</head>"); 42 out.println("<body>"); 43 44 out.println("<p>テストページ1</p>"); 45 46 out.println("<p><a href=\"/auth/CustomAuth2\">テストページ2へ</a></p>"); 47 48 out.println("</body>"); 49 out.println("</html>"); 50 } 51}

javaEE

1import java.io.IOException; 2import java.io.PrintWriter; 3 4import javax.servlet.ServletException; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8import javax.servlet.http.HttpSession; 9 10public class Login2 extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws IOException, ServletException{ 14 15 response.setContentType("text/html; charset=UTF-8"); 16 PrintWriter out = response.getWriter(); 17request.setCharacterEncoding("UTF-8"); 18 19 out.println("<html>"); 20 out.println("<head>"); 21 out.println("<title>ログインページ</title>"); 22 out.println("</head>"); 23 out.println("<body>"); 24 25 out.println("<h1>ログイン画面</h1>"); 26 27 HttpSession session = request.getSession(true); 28 29 /* 認証失敗から呼び出されたのかどうか */ 30 Object status = session.getAttribute("status"); 31 32 if (status != null){ 33 out.println("<p>認証に失敗しました</p>"); 34 out.println("<p>再度ユーザー名とパスワードを入力して下さい</p>"); 35 36 session.setAttribute("status", null); 37 } 38 39 out.println("<form method=\"POST\" action=\"/auth/LoginCheck\" name=\"loginform\">"); 40 out.println("<table>"); 41 out.println("<tr>"); 42 out.println("<td>ユーザー名</td>"); 43 out.println("<td><input type=\"text\" name=\"name\" size=\"32\"></td>"); 44 out.println("</tr>"); 45 out.println("<tr>"); 46 out.println("<td>パスワード</td>"); 47 out.println("<td><input type=\"password\" pass=\"pass\" size=\"32\"></td>"); 48 out.println("</tr>"); 49 out.println("<tr>"); 50 out.println("<td><input type=\"submit\" value=\"login\"></td>"); 51 out.println("<td><input type=\"reset\" value=\"reset\"></td>"); 52 out.println("</tr>"); 53 out.println("</table>"); 54 out.println("</form>"); 55 56 out.println("</body>"); 57 out.println("</html>"); 58 } 59}

javaEE

1 2import java.io.IOException; 3import java.io.PrintWriter; 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.sql.PreparedStatement; 7import java.sql.ResultSet; 8import java.sql.SQLException; 9 10import javax.servlet.ServletException; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.HttpSession; 15 16public class LoginCheck2 extends HttpServlet { 17 18 protected Connection conn= null; 19 public void init() throws ServletException{ 20 21 String url = "jdbc:mysql://localhost:3306?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; 22 String user = "root"; 23 String password ="root"; 24 25 try { 26 Class.forName("com.mysql.jdbc.Driver").newInstance(); 27 conn = DriverManager.getConnection(url, user, password); 28 }catch (ClassNotFoundException e) { 29 log("ClassNotFoundException:" + e.getMessage()); 30 }catch(SQLException e) { 31 log("SQLException:" + e.getMessage()); 32 }catch (Exception e) { 33 log("Exception:" + e.getMessage()); 34 } 35 } 36 public void destory() { 37 try { 38 if(conn != null) { 39 conn.close(); 40 } 41 }catch (SQLException e) { 42 log("SQLException:" + e.getMessage()); 43 } 44 } 45 public void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws IOException, ServletException{ 47 response.setContentType("text/html; charset=UTF-8"); 48 PrintWriter out = response.getWriter(); 49 System.out.println(out); 50 51request.setCharacterEncoding("UTF-8"); 52 53 String name=request.getParameter("name"); 54 String pass=request.getParameter("pass"); 55 HttpSession session=request.getSession(true); 56 boolean check = authUser(name, pass); 57 if(check) { 58 session.setAttribute("login", "OK"); 59 60 String target=(String)session.getAttribute("target"); 61 response.sendRedirect(target); 62 }else { 63 session.setAttribute("status", "Not Auth"); 64 response.sendRedirect("/auth/Login"); 65 } 66 67 } 68 protected boolean authUser(String name, String pass) { 69 if(name == null || name.length() == 0 || pass == null || pass.length() == 0) { 70 return false; 71 } 72 73 74 75 try { 76 String sql = "SELECT name, pass FROM rensyu.member1 WHERE name = ? and pass = ? "; 77 PreparedStatement pstmt = conn.prepareStatement(sql); 78 pstmt.setString(1, name); 79 pstmt.setString(2, pass); 80 81 ResultSet rs =pstmt.executeQuery(); 82 83 if(rs.next()) { 84 return true; 85 86 }else { 87 88 return false; 89 } 90 91 }catch (SQLException e) { 92 log("SQLException:" + e.getMessage()); 93 94 return false; 95 } 96} 97}

javaEE

1import java.io.IOException; 2import java.io.PrintWriter; 3 4import javax.servlet.ServletException; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8import javax.servlet.http.HttpSession; 9 10public class Logout1 extends HttpServlet { 11 public void doGet(HttpServletRequest request, HttpServletResponse response) 12 throws IOException, ServletException{ 13 14 response.setContentType("text/html; charset=UTF-8"); 15 PrintWriter out = response.getWriter(); 16 System.out.println(out); 17request.setCharacterEncoding("UTF-8"); 18 19 HttpSession session = request.getSession(true); 20 session.invalidate(); 21 22 response.sendRedirect("/auth/Login"); 23 } 24}

試したこと

➀SQL文の修正
➁データベースのテーブルの修正
➂デバッグ
→Eclipse上でソースコード(呼び出しを想定しているメソッドの先頭のステートメント)にブレークポイントを設定してサーバーをデバッグモードで実行しましたら、入力したデータはしっかり
入りました。

➃サーブレットのString name=request.getParameter("name");
String pass=request.getParameter("pass");
pstmt.setString(1, name);
pstmt.setString(2, pass);
でname、passに値を詰めて何が入っているかをSystem.out.printlnで確認した結果
・name(ユーザー名)は入力した正しいデータが出力されました
・pass(パスワード)も入力した正しいデータが出力されました。
※SQL文のCreateではどちらも文字列コードはUTF-8に設定しました。
(対象となっているテーブルを作成した際のSQL文)
CREATE TABLE member1 (
name varchar(100) DEFAULT NULL,
pass varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

補足情報(FW/ツールのバージョンなど)

・Eclipse 4.8
・MySQL5.7
・java1.8.0_211

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

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

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

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

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

m.ts10806

2019/11/18 09:40

ファイル毎にコードブロックをわけていただいたほうが確認しやすいのですが…
javas

2019/11/18 09:48

すみません。 修正します。
jimbe

2019/11/18 11:39

各所にログ出力を入れてトレースされたような形跡が見られませんが, 動作はどこまで確認されてますでしょうか.
A-pZ

2019/11/18 13:20

サーブレットフィルタの設定やサーブレットの設定を記載している web.xml も記載したほうが良いでしょう。
ironya

2019/11/18 21:32

サーバーをデバッグモードで実行して、呼び出しを想定しているメソッドの先頭のステートメントにブレークポイントを設定して、実際に呼び出されるかどうかをまず確認してみたらどうでしょう。
javas

2019/11/19 01:05

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>CustomAuth1</servlet-name> <servlet-class>CustomAuth3</servlet-class> </servlet> <servlet-mapping> <servlet-name>CustomAuth1</servlet-name> <url-pattern>/CustomAuth1</url-pattern> </servlet-mapping> <servlet> <servlet-name>CustomAuth2</servlet-name> <servlet-class>CustomAuth4</servlet-class> </servlet> <servlet-mapping> <servlet-name>CustomAuth2</servlet-name> <url-pattern>/CustomAuth2</url-pattern> </servlet-mapping> <servlet> <servlet-name>Login</servlet-name> <servlet-class>Login2</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping> <servlet> <servlet-name>LoginCheck</servlet-name> <servlet-class>LoginCheck2</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginCheck</servlet-name> <url-pattern>/LoginCheck</url-pattern> </servlet-mapping> <servlet> <servlet-name>Logout</servlet-name> <servlet-class>Logout1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Logout</servlet-name> <url-pattern>/Logout</url-pattern> </servlet-mapping> </web-app> こちらが実装しようとしているプロジェクトのweb.xmlファイルになります。
m.ts10806

2019/11/19 01:28

質問は編集できますので
javas

2019/11/19 01:54

認証画面からデータを入力し、認証に成功した場合の処理が出来ずに認証が失敗した場合のメッセージ出力しかできない状態です。 デバッグを行いましたが、変数が表示されていないのでやはりSQL文が実行されていないということでしょうか? 以前SQL文のエラーメッセージが表示されたので修正したときにエラーメッセージが出力されなくなったのでSQL文はしっかり実行されているものだと思っていました。
m.ts10806

2019/11/19 01:57

「エラーがでない」と「想定の結果を返す」はまた別です。 また「デバッグを行ったが変数が表示されない」ではなにも伝わりません。 デバッグにも色々手法やポイントがありますので、より具体的に「質問本文に」追記してください。
tetutetu

2019/11/19 02:09

とりあえず回答内容を試してみてはいかがでしょうか。
javas

2019/11/19 02:58

コメントして頂いたことについて一通り実行してみました。
A-pZ

2019/11/19 15:36

詳細なソースコードと設定ありがとうございました。検証してみますのでお待ちください。
javas

2019/11/20 05:45

すみません。 ありがとうございます。 自分自身でもう一度見直してみます。
guest

回答2

0

out.println("<td><input type=\"password\" pass=\"pass\" size=\"32\"></td>");
nameでは

追記

・name(ユーザー名)は漢字で入力しましたが文字化けで出力されました

・pass(パスワード)は数字で入力しましたがnullで出力されました。

から分かる点として
①サーブレットにリクエストを投げること自体はできている(getParameter("name")で値の取得自体はできている)
②passを渡す箇所、もしくは受け取る箇所のどちらかがおかしい
③パラメータの文字コードがおかしい
の3点です。

②について
パラメータを受け取る部分に問題はなさそうに見受けられます。
となるとやはり入力側に問題がありそうです。
最初の回答で記述した部分が正しく修正できているかを確認してください。
(今回に限らず 修正を行った箇所は逐次質問文に反映させた方が解決につながりやすいです。)

③について
パラメータの文字コードを指定していないことが原因かと思われます。
パラメータを受け取るよりも前に
request.setCharacterEncoding("UTF-8");
を記述する必要があります。

投稿2019/11/19 00:48

編集2019/11/19 04:05
tetutetu

総合スコア419

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

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

javas

2019/11/19 02:09

passの部分をnameに変更して再度、実行しましたが認証できませんでした。
tetutetu

2019/11/19 02:11

サーブレットの String name=request.getParameter("name"); String pass=request.getParameter("pass"); でそれぞれname、passに値を詰めていますが 詰めた直後の段階で何が入っているか確認してください 結果は「どの部分で」「何をして」「どうなったか」を質問本文に追記してください
javas

2019/11/19 02:20

わかりました。
javas

2019/11/19 02:59

他の方がコメントして頂いたことも含め一通り実行してみました。
tetutetu

2019/11/19 04:05

追記しました
javas

2019/11/19 06:01 編集

ありがとうございます。 入力時、SQL文実行時のデータは共に正しいデータが入るようになりました。 ですが、まだ認証できません。 SQL文を実行したあとのif文に誤りがあるということでしょうか?
tetutetu

2019/11/19 06:54

流石にコード全部読む気力がないので 一個気になったところを。 init()メソッド内で conn = DriverManager.getConnection(url, user, password); してますが、init()を呼び出している箇所はありますか? (そもそもconnがnullのまま処理しようとしても例外出ないんでしたっけ?)
javas

2019/11/20 05:44

ありがとうございます。 確認しましたが、やはりinit()はソースのどこにも使用されていませんでした。 connがnullの場合は例外処理を入れるべきでした。
guest

0

デプロイメント・ディスクリプタ(web.xml)の記載ありがとうございました。

見たところ、認証済みかのチェックをつかさどっている、AuthFilter1 の定義がないので、動作していないようです。

投稿2019/11/21 00:21

A-pZ

総合スコア12011

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

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

javas

2019/11/21 02:11

web.xmlにてAuthFilter1の定義を行いましたが、認証できませんでした。
A-pZ

2019/11/21 03:33

AuthFilter1の定義をどのように行ったのでしょうか…?定義内容が書かれていないと判断はつきません。
javas

2019/11/21 05:58

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <filter> <filter-name>AuthFilter</filter-name> <filter-class>AuthFilter1</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/CustomAuth1</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/CustomAuth2</url-pattern> </filter-mapping> <servlet> <servlet-name>CustomAuth1</servlet-name> <servlet-class>CustomAuth5</servlet-class> </servlet> <servlet-mapping> <servlet-name>CustomAuth1</servlet-name> <url-pattern>/CustomAuth1</url-pattern> </servlet-mapping> <servlet> <servlet-name>CustomAuth2</servlet-name> <servlet-class>CustomAuth6</servlet-class> </servlet> <servlet-mapping> <servlet-name>CustomAuth2</servlet-name> <url-pattern>/CustomAuth2</url-pattern> </servlet-mapping> <servlet> <servlet-name>Login</servlet-name> <servlet-class>Login2</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping> <servlet> <servlet-name>LoginCheck</servlet-name> <servlet-class>LoginCheck2</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginCheck</servlet-name> <url-pattern>/LoginCheck</url-pattern> </servlet-mapping> <servlet> <servlet-name>Logout</servlet-name> <servlet-class>Logout1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Logout</servlet-name> <url-pattern>/Logout</url-pattern> </servlet-mapping> </web-app> 以上が編集したweb.xmlファイルです。
A-pZ

2019/11/21 13:10

CustomAuth5やCustomAuth6の定義がありますが、この質問に書かれていないクラスではないでしょうか? 一度、最新の実装状態で質問を書き直された方が良いです。(ないしは一度質問をクローズするなど)
javas

2019/11/22 01:27

customAuth5が以前のcustmoAuth3で、customAuth6がcoutomAuth4の部分に当たります。 こちらのクラスを質問に追加しようとしましたがteratailの質問の文字数規定に達するため 追加できませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問