

Eclipseを使用してログインフォームを作成したのですが、useridとpassを入力してログインボタンを押してもnullが返されてしまいます。  
データベースにデータは登録できているのですがなぜかできないです。

DAOクラス

[code]

    package dao;
    
    import java.security.SecureRandom;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.apache.commons.codec.digest.DigestUtils;
    
    import bean.User;
    
    public class LoginDao {
    
        //JDBC接続情報
        public static String RDB_DRIVE = "com.mysql.jdbc.Driver";
        public static String URL = "jdbc:mysql://localhost/logindb";
        public static String USER ="root";
        public static String PASS = "root";
    
        private static SecureRandom random = new SecureRandom();
    
        //JDBC接続メソッド
        public Connection getConnection(){
            try{
                Class.forName(RDB_DRIVE);
                Connection con = DriverManager.getConnection(URL,USER,PASS);
                return con;
    
            }catch(Exception e){
                throw new IllegalStateException(e);
            }
        }
    
        //新規登録メソッド(パスワードはハッシュ化)
        public void InsertUser(String userid, String pass){
            Connection con = null;
            PreparedStatement smt = null;
    
            try{
                con = getConnection();
                String sql = "INSERT INTO loginfo (userid,pass,salt) VALUES (?,?,?)";
                smt = con.prepareStatement(sql);
    
                //ランダムなソルトを生成
                byte[] salt = generateSalt();
    
                //ソルトを含めてパスワードをハッシュ化
                String hashedPassword = hashPassword(pass,salt);
    
                smt.setString(1, userid);
                smt.setString(2, hashedPassword);
                smt.setBytes(3, salt);
    
                smt.executeUpdate();
    
            }catch(Exception e){
                throw new IllegalStateException(e);
            }finally{
                try{
                    if(smt != null){
                        smt.close();
                    }
                    if(con != null){
                        con.close();
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    
        //ランダムなソルト生成
        private byte[] generateSalt(){
            byte[] salt = new byte[16];
            random.nextBytes(salt);
            return salt;
        }
    
        //ハッシュ化パスワード生成
        private String hashPassword(String pass, byte[] salt){
            //反復回数
            int iterations = 1000;
            //ソルトを含めてSHA-256でハッシュ化
            String saltedPassword = pass + new String(salt);
            String hashedPassword = saltedPassword;
    
            for(int i=0;i<iterations;i++){
                hashedPassword = DigestUtils.sha256Hex(hashedPassword);
            }
            //Apache Commons Codeを使用してSHA-256でハッシュ化
            return hashedPassword;
        }
    
        //ユーザー情報削除メソッド
        public void deleteUser(String userid, String pass){
            Connection con = null;
            PreparedStatement smt = null;
    
            try{
                con = getConnection();
                String sql = "DELETE FROM loginfo WHERE userid = ? AND pass = ?";
                smt = con.prepareStatement(sql);
                smt.setString(1, userid);
                smt.setString(2, pass);
                smt.executeUpdate();
    
            }catch(Exception e){
                throw new IllegalStateException(e);
            }finally{
                try{
                    if(smt != null){
                        smt.close();
                    }
                    if(con != null){
                        con.close();
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
        }
    
        //ユーザー情報検索メソッド
        public User select(String userid, String pass){
            Connection con = null;
            PreparedStatement smt = null;
            User user = new User();
    
            try{
                con = getConnection();
                String sql = "SELECT * FROM loginfo WHERE userid = ? AND pass = ?";
                smt = con.prepareStatement(sql);
                smt.setString(1, userid);
                smt.setString(2, pass);
    
                ResultSet rs = smt.executeQuery();
    
                if(rs.next()){
                    user.setUserid(rs.getString("userid"));
                    user.setPass(rs.getString("pass"));
                } else {
                    System.out.println("Retrieved user: " + user.getUserid() + ", Pass: " + user.getPass());
                }
    
            }catch(Exception e){
                e.printStackTrace();
                throw new IllegalStateException(e);
            }finally{
                try{
                    if(smt != null){
                        smt.close();
                    }
                    if(con != null){
                        con.close();
                    }
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            return user;
        }
    }
    
[/code]

BEANクラス

[code]

    package bean;
    
    public class User {
    
        private String userid;
        private String pass;
    
        public String getUserid() {
            return userid;
        }
        public void setUserid(String userid) {
            this.userid = userid;
        }
        public String getPass() {
            return pass;
        }
        public void setPass(String pass) {
            this.pass = pass;
        }
    
    
    }
    
[/code]

サーブレット

[code]

    package servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.codec.digest.DigestUtils;
    
    import bean.User;
    import dao.LoginDao;
    
    public class SelectServlet extends HttpServlet{
    
        public void doPost(HttpServletRequest request,HttpServletResponse response)
                throws ServletException,IOException{
    
            //エンコーディング設定
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;utf-8");
    
            //パラメーター取得
            String userid = request.getParameter("userid");
            String pass = request.getParameter("pass");
    
            //Userオブジェクト、Daoオブジェクト生成
            LoginDao logdao = new LoginDao();
            User user = new User();
    
            //検索メソッド呼び出し
            user = logdao.select(userid, pass);
    
            try{
                if(user.getUserid() != null && checkPassword(pass,user.getPass())){
                    request.getRequestDispatcher("/view/complete.jsp").forward(request, response);
                } else if(userid.isEmpty() || pass.isEmpty()){
                    request.getRequestDispatcher("/view/error.jsp").forward(request, response);
                }
    
            }catch(Exception e){
                e.printStackTrace();
            }
    
        }
    
        //パスワードの一致判定を行うメソッド
        private boolean checkPassword(String inputPassword,String hashedPasswordFromDB){
            String hashedPasswordFromInput = DigestUtils.sha256Hex(inputPassword);
            return hashedPasswordFromDB.equals(hashedPasswordFromInput);
    
        }
    
        public void doGet(HttpServletRequest request,HttpServletResponse response)
                throws ServletException,IOException{
    
            doGet(request,response);
        }
    }
    
[/code]

データベースに追加するサーブレット

[code]

    package servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import dao.LoginDao;
    
    public class LoginServlet extends HttpServlet{
        public void doPost(HttpServletRequest request,HttpServletResponse response)
            throws ServletException,IOException{
    
            //エンコーディング設定
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;utf-8");
    
            //パラメータ取得
            String userid = request.getParameter("userid");
            String pass = request.getParameter("pass");
    
            String message ="";
            //入力が空であればエラー表示
            if(userid == null || userid.isEmpty() || pass == null ||  pass.isEmpty()){
                message = "入力してください";
            }
    
            //daoオブジェクト生成
            LoginDao login = new LoginDao();
    
            if(message.isEmpty()){
                //登録メソッド呼び出し
                login.InsertUser(userid,pass);
                //リクエストスコープ
                request.getRequestDispatcher("/view/userset.jsp").forward(request, response);
            }else{
                //入力パラメータメッセージをセット
                request.setAttribute("message", message);
                request.getRequestDispatcher("/view/newuser.jsp").forward(request, response);
            }
    
        }
    
        public void doGet(HttpServletRequest request,HttpServletResponse response)
                throws ServletException,IOException{
            doPost(request,response);
        }
    }
    
[/code]


CC BY-SA 4.0
2023-08-12T12:48:40.893
95927
2023-08-12T23:49:16.673
2023-08-12T16:22:43.453
3060
59454
question
java servlet jdbc
ログインフォームでのログイン時、ボタンを押しても null が返されてしまう


`LoginDao.InsertUser()`では、(引数の)パスワードをハッシュ化してDBに格納しているのに対し、`LoginDao.select()`では、(引数の)パスワードをそのまま検索条件にしているので、一致するものが見つけられないように見受けました。

＃(ログインボタンを押すとおそらくSelectServletが呼ばれると予想しましたが)サーブレット内でハッシュ化してはいないように見受けました。

検索するときもパスワードをハッシュ化すれば良いと思います。  
いかがでしょうか?


CC BY-SA 4.0
2023-08-12T23:49:16.673
95928
2023-08-12T23:49:16.673
20098
95927
answer