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

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

詳細はこちら
Java

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

2955閲覧

ログイン画面でDBとの照合がif関数を使ってうまくできません。ご教授ください。

fukegao

総合スコア5

Java

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

1グッド

1クリップ

投稿2021/01/14 09:50

前提・実現したいこと

Javaでログイン画面を作成する勉強をしています。
入力されたIDとパスワードをデーターベースのリストと照合して、合致すればセッションスコープに保存して、次のサイトの進めるようにしたいと思っています。
入力画面→サーブレット→Modelクラス→DAOクラス→DB
の構成でDBからデーターリストは取得でき、Modelクラスでif関数を使って入力されたデーターと照合まではできています。

###エラーメッセージ

しかしながら、else関数を加えると、一つのデーターだけしかログインできなくなります。
DBのリスト上にある他のデーターを入れても間違えですと反応されてしまいます。
else関数をコメントアウトすると、DBのリスト上すべてのデーターと照合でき、ログインすることができます。

該当のソースコード

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%String msg=(String)request.getAttribute("msg"); 4 String Msg=""; 5 if(msg==null){ 6 Msg=""; 7 } 8 else{ 9 Msg=msg; 10 } 11 %> 12 13<!DOCTYPE html> 14<html> 15<head> 16<meta charset="UTF-8"> 17<title>BoTTes-ログイン-</title> 18<style type="text/css"> 19<!-- 20*{ 21margin:0px;padding:0px; 22} 23.back1{ 24width: 300px; 25height: 50px; 26position: absolute; 27top: 50px; 28left: 510px; 29} 30.font1{ 31font-size: 200%; 32} 33.font3{ 34font-size:100%; 35color:red; 36} 37.back2{ 38width: 1280px; 39height: 50px; 40position: absolute; 41top: 100px; 42left: 0px; 43} 44hr{ 45height: 5px; 46background-color: grey; 47border: none; 48} 49.back3{ 50width: 300px; 51height: 50px; 52position: absolute; 53top: 150px; 54left: 480px; 55} 56.back4{ 57width: 300px; 58height: 50px; 59position: absolute; 60top: 230px; 61left: 600px; 62} 63.submit{ 64font-size: 1em; 65} 66--></style> 67</head> 68<body> 69<div class="back1"><p class="font1"> ログイン画面</p><br> 70 <p class="font3"><%= Msg %></p></div> 71<div class="back2"><hr></div> 72<div class="back3"> 73<form method="post" action="LoginServlet2"> 74<table> 75<tr><td>ユーザーID</td><td><input type="text" name="userid"value=""></td></tr> 76<tr><td>パスワード</td><td><input type="text" name="password" value=""></td></tr> 77</table> 78</div> 79<div class="back4"> 80<input class="submit" type="submit" width=10px height=10px value=" ログイン "> 81<input type="hidden" name="mode" value="login"> 82</div> 83</body> 84</html>

Servlet

1ackage servlet; 2 3import java.io.IOException; 4 5import javax.servlet.RequestDispatcher; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11import javax.servlet.http.HttpSession; 12 13/** 14 * Servlet implementation class LoginServlet2 15 */ 16@WebServlet("/LoginServlet2") 17public class LoginServlet2 extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 22 */ 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 // TODO Auto-generated method stub 25 request.setCharacterEncoding("UTF-8"); 26 27 String mode = request.getParameter("mode"); 28 29 String jsp =""; 30 if(mode==null) { 31 request.setAttribute("msg",""); 32 jsp="login2.jsp"; 33 34 } 35 36 if(mode.equals("login")) { 37 LoginModel2 lm2=new LoginModel2(); 38 jsp=lm2.certify(request); 39 } 40 else if(mode.equals("logout")) { 41 request.setAttribute("msg","ログアウトしました"); 42 HttpSession session = request.getSession(); 43 session.invalidate(); 44 jsp="login2.jsp"; 45 46 } 47 48 RequestDispatcher rd = request.getRequestDispatcher(jsp); 49 rd.forward(request,response); 50 51 52 } 53 54 /** 55 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 56 */ 57 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 58 // TODO Auto-generated method stub 59 doGet(request, response); 60 } 61 62}

Model

1package servlet; 2 3import java.util.List; 4 5import javax.servlet.http.HttpServletRequest; 6import javax.servlet.http.HttpSession; 7 8import beans.RegisterBean2; 9import beans.UserBean; 10import dao.SelectRegisterDAO; 11 12 13public class LoginModel2 { 14 15 public String certify( HttpServletRequest request) { 16 17 18 19 // データーベースからデーターを取り出す 20 SelectRegisterDAO srd = new SelectRegisterDAO(); 21 List<RegisterBean2> list = srd.read(); 22 23 24 //パラメーターの取得 25 String id=request.getParameter("userid"); 26 String password=request.getParameter("password"); 27 String jsp=""; 28 29 for( RegisterBean2 bn : list) { 30 31 String userid=bn.getUserid(); 32 String pw=bn.getPw(); 33 String name=bn.getUsername(); 34 35 //IDとpasswordを照合 36 if(id.equals(userid)&&password.equals(pw)) { 37 38 request.setAttribute("name",name); 39 40 41 //セッション開始 42 HttpSession session=request.getSession(); 43 44 45 UserBean ub = new UserBean(); 46 47 ub.setUserid(userid); 48 ub.setPassword(pw); 49 ub.setName(name); 50 51 52 session.setAttribute("User", ub); 53 54 jsp="login_success.jsp"; 55 } 56 /*else { 57 request.setAttribute("msg","IDもしくはパスワードが間違っています"); 58 jsp="login2.jsp"; 59 60 }*/ 61 62 63 64 } 65 return jsp; 66 67 68 } 69}

DAO

1package dao; 2 3import java.sql.Connection; 4import java.sql.SQLException; 5 6import beans.RegisterBean; 7 8public class RegisterDAO extends BaseDAO{ 9 10 public void create(RegisterBean rdao) { 11 try { 12 //コネクションを取得する 13 Connection con = super.getConnection(); 14 //ステートメント作成 15 java.sql.Statement stmt = con.createStatement(); 16 //SQL文を作成 17 String sql = "INSERT INTO registers(userid,password,name,address,phone)VALUES(" 18 +"'"+rdao.getUserid()+"'," 19 +"'"+rdao.getPassword()+"'," 20 +"'"+rdao.getName()+"'," 21 +"'"+rdao.getAddress()+"'," 22 +"'"+rdao.getPhone()+"')"; 23 24 stmt.executeUpdate(sql); 25 stmt.close(); 26 con.close(); 27 }catch(SQLException e) { 28 e.printStackTrace(); 29 } 30 31 } 32}

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import="beans.UserBean" %> 4 <% 5 UserBean ub =(UserBean)session.getAttribute("User"); 6if(ub==null){ 7 response.sendRedirect("LoginServlet2"); 8 9} 10 String user=(String)request.getAttribute("name"); 11 12 %> 13<!DOCTYPE html> 14<html> 15<head> 16<meta charset="UTF-8"> 17<title>BoTTes-ログイン-</title> 18<style type="text/css"> 19<!-- 20*{ 21margin:0px;padding:0px; 22} 23.back1{ 24width: 300px; 25height: 50px; 26position: absolute; 27top: 50px; 28left: 510px; 29} 30.font1{ 31font-size: 150%; 32} 33.font2{ 34font-size:100%; 35} 36.back2{ 37width: 1280px; 38height: 50px; 39position: absolute; 40top: 100px; 41left: 0px; 42} 43hr{ 44height: 5px; 45background-color: grey; 46border: none; 47} 48.back3{ 49width: 300px; 50height: 50px; 51position: absolute; 52top: 150px; 53left: 480px; 54} 55.back4{ 56width: 300px; 57height: 50px; 58position: absolute; 59top: 300px; 60left: 520px; 61} 62 63--></style> 64</head> 65<body> 66<div class="back1"><p class="font1"><%=user %>様</p><br></div> 67<div class="back2"><hr></div> 68<div class="back3"><p class="font2">現在ログインしています<br> 69 コンテンツをご利用できます<br> 70<a href ="../websys/top.html">ショッピング画面へ</a></p> 71</div> 72<div class="back4"> 73<form method="POST" action="LoginServlet2"> 74<input type="submit" value="ログアウト"> 75<input type="hidden" name="mode" value="logout"> 76</form> 77</div> 78</body> 79</html>

試したこと

DAOクラスのDBからのデーターの取得ができているかは、別にクラスを作り確認できました。
DAOクラス→Modelへの受け渡しも、確認できています。
Modelのif関数の照合もできています。

補足情報

Windows10でTomcat7.0.107とEclipse2018を使用しています。

10rara👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

タイトル時点で「間違ってるな」と思ったので、コードほとんど読んでません。

DBとの照合がif関数を使ってうまくできません。

DBのメリットが全くないです。
DBのメリットは「必要な情報に即座に(直接)アクセスできる」というところにあります。
わざわざ全件取得してきて全回しする必要はないです。
100万件とあった場合、100万件目のデータだけ欲しい場合に100万周待ちますか?

SQLにWHERE句というのがあり、「この条件のデータを取得してこい」とWHERE句で指示すれば、
1発で済みます。

今回ならログインなので「IDとパスワード」でしょうか。
IDが一意であるなら、この問い合わせだけで「1か0か」はっきりします。
全回しする必要なく、「取得できた/できなかった」だけで判断できます。

まずは欲しいデータだけを抽出してくるということを覚えてください。
コードやループが少なければそれだけ処理の待ちや消費するメモリが少なく済みます。

SQLも工夫次第で様々な取得の仕方ができます。
書式のフォーマットや分岐などもつけられます。
他のテーブルと結合してデータを取得してくることもできます。

可能な限り使いたい形でデータを取得してくることができれば、
ロジック(今回はJavaのコード)でこねくり回さなくても済みます。

もちろん全回しでもできなくはないですが、「一致したらループを抜ける」処理とか
色々必要ですよね。
もし一致なければ全部回さないと分からないのはやはり非効率です。

考えてみてください。


あと蛇足ですが、ifは関数ではなく文(構文)です。


もう1つ蛇足ですが、SQLインジェクション可能な作りになっています。
投入するデータによってはおそらくSQLExceptionも発生させられます。
プリペアドステートメント使って適切にご対応ください。

投稿2021/01/14 11:20

編集2021/01/14 11:41
m.ts10806

総合スコア80875

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

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

fukegao

2021/01/14 16:20

早々にご回答いただきまして、誠にありがとうございました。 勉強不足でお恥ずかしい限りです。 おっしゃるとおり非効率だと思います。 SQLExceptionに関しましても全く知識不足で……。もっと勉強したいと思います。 丁寧かつ率直にご指摘いただきまして、心より感謝致します。
m.ts10806

2021/01/14 19:06

>SQLExceptionに関しましても いえ、「SQLインジェクション」です。 SQLExceptionは単なるJavaの例外の一種。 「SQLインジェクション」はセキュリティ攻撃の一種です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問