前提・実現したいこと
ログイン画面から送られてきたユーザー名とパスワードでデータベース内のデータを照合してユーザーの認証を行います。
実際の処理としてはユーザー管理用のテーブルをユーザー名とパスワードが一致するレコードがあるかどうかを検索して、あれば認証する
発生している問題・エラーメッセージ
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