1

MVC パターンを使用して Java EE で簡単なログイン プログラムを作成しています。パスワードが 1 年以上経過していることをユーザーに警告したいと考えています。現在、データベースからデータを取得して文字列に変換できますが、その後、現在の日付と比較する方法がわかりません。

これは私がこれまでに持っているものです:

public String validateAccount(String email, String enterPassword) {

        try {
            Class.forName(driverName).newInstance();
        } catch (InstantiationException | IllegalAccessException
                | ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Connection connection;

        try {

            connection = DriverManager.getConnection(dbURL, username, password);

            // Retrive current user data from database
            String getCredentials = "SELECT id,dateSet,strength FROM users WHERE email=? AND hashPassword=SHA2(CONCAT(?, salt), 256)";
            PreparedStatement verifyCredentials = connection
                    .prepareStatement(getCredentials);
            verifyCredentials.setString(1, email);
            verifyCredentials.setString(2, enterPassword);
            ResultSet foundData = verifyCredentials.executeQuery();

            while (foundData.next()) {
                System.out.println("Found account");
                int id = foundData.getInt("id");
                String dateSet = foundData.getString("dateSet");
                String strength = foundData.getString("strength");

                // ... do something with these variables ... if
                if (strength.equals("Weak")) {
                    return "1";

                } else if (/*Check if the date in the database is over a year old, and return 2*/) {
                    return "2";
                } else {
                    return "0";
                }

            }
            foundData.close();

            return "Account not found, re-enter your info again";

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return "";

    }
4

2 に答える 2

3

代わりに foundData.getTimestamp() を使用し、タイムスタンプを取得して、通常の Java Data クラスに変換できます:)

だから、あなたは次のようなものを持つでしょう

Date dateSet = new Date(foundData.getTimestamp("dateSet").getTime());

または、Date インスタンスの操作に慣れていない場合 (Calendar も使用する必要があります)、SQL クエリで直接チェックを行うことができます。

String getCredentials = "SELECT id,dateSet,strength, IF(dateSet < NOW() - INTERVAL 1 YEAR, TRUE, FALSE) AS oldPasswd FROM users WHERE email=? AND hashPassword=SHA2(CONCAT(?, salt), 256)";

その後

else if (foundData.getBoolean("oldPasswd")) {
   return "2";
}
于 2013-03-07T18:43:38.383 に答える
2

これを試して

java.sql.Date date  = foundData.getDate("dateSet");
java.sql.Date date2 =  new Date(System.currentTimeMillis());
date2.compareTo(date);

結果セットから日付にアクセスする方法を変更しました。引数 Date がこの Date と等しい場合、"compareTo" は値 0 を返すことに注意してください。この Date が Date 引数より前の場合は 0 未満の値。この Date が Date 引数より後の場合は 0 より大きい値。

次の方法では、日数の差が得られます

public static long daysBetween(Date sd, Date ed) {
    Calendar startDate = Calendar.getInstance();
    startDate.setTime(sd);
    Calendar endDate = Calendar.getInstance();
    startDate.setTime(ed);
    Calendar date = (Calendar) startDate.clone();
    long daysBetween = 0;
    while (date.before(endDate)) {
        date.add(Calendar.DAY_OF_MONTH, 1);
        daysBetween++;
    }
    return daysBetween;
}
于 2013-03-07T18:48:01.130 に答える