用户登录

模拟用户登录功能

配置信息:

  1. EditPlus 文本编辑器或者 类似 IDEA 的 IDE 工具(2019.3、JDK11)
  2. MySQL DBMS(MySQL8)
  3. MySQL 实现 Java.sql 包下接口的 jar 包(mysql-connector-java-5.1.48)
  4. Power Deisigner(16.5)

1. 首先使用PowerDesigner工具进行数据库中表的设计,得到.pdm文件。如下:


与此同时,PD为我们写好了简单的sql脚本,保存下来,如下:

这里可以对sql脚本进行适当的编辑,以符合我们的要求:插入几条用户信息到数据库中,以便后面登陆时对其进行验证,脚本程序如下:

drop table if exists t_user;

/*==============================================================*/
/* Table: t_user                                                */
/*==============================================================*/
create table t_user
(
   id                   int auto_increment,
   loginName            varchar(255),
   loginPwd             varchar(255),
   realName             varchar(255),
   primary key (id)
);

insert into t_user(loginName, loginPwd, realName) values('zhangsan', '222', '张三');
insert into t_user(loginName, loginPwd, realName) values('lisi', '111', '李四');
insert into t_user(loginName, loginPwd, realName) values('wangwu', '333', '王五');

commit;

select * from t_user;

2. 数据准备好之后,开始写 Java 程序:

说明:

  1. 这里的数据库用户名用xxx代替,密码用yyy代替,表名用zzz代替
  2. 一开始运行时出错,在表名后加入useUnicode=true&characterEncoding=utf-8&useSSL=false解决
    代码:
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 模拟用户登录功能
 *      程序运行时,提供一个输入的入口,让用户输入用户名和密码
 *      用户输入用户名和密码之后,提交信息,Java程序收到用信息
 *      JAVA 程序连接数据库验证用户信息是否合法,合法显示“登录成功”,否则显示“登录失败”
 *
 * 数据准备:
 *      实际开发中,表的设计会使用专业的建模工具。使用PD工具进行数据库表的设计
 *      (参见user-login.sql脚本)
 */
public class JDBCTest05 {
    public static void main(String[] args) {
        // 初始化一个界面
        Map<String,String> userLoginInfo = InitUI();
        // 验证用户名和密码
        boolean loginSuccess = login(userLoginInfo);
        // 最后输出结果
        System.out.println(loginSuccess == true ? "登录成功,欢迎!" : "登录失败!");
    }

    /**
     * 用户登录
     * @param userLoginInfo 用户登录输入的信息
     * @return 返回 true 表示登录成功,false 表示登录失败
     */
    private static boolean login(Map<String, String> userLoginInfo){
        // 标记
        boolean loginSuccess = false;

        String username = userLoginInfo.get("username");
        String password = userLoginInfo.get("password");
        // JDBC 代码
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2. 获取连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/zzz?useUnicode=true&characterEncoding=utf-8&useSSL=false",
                    "xxx", "yyy");

            // 3. 获取数据库操作对象
            stmt = conn.createStatement();

            // 4. 执行 sql 语句
            // 普通的字符串拼接:"+  +"
            String sql = "select * from t_user where loginName = '" + username + "' and loginPwd = '" + password + "'";
            rs = stmt.executeQuery(sql);

            // 这里不用循环,因为只需要查一条记录,如果查不到,说明输入的信息时错的,如果查到了,说明用户信息输入正确
            if (rs.next()){
                loginSuccess = true;
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

        // 5. 处理查询结果集
        return loginSuccess;
    }

    /**
     * 初始化用户界面
     * @return 返回用户输入的用户名和密码等登录信息
     */
    private static Map<String,String> InitUI() {
        Scanner s = new Scanner(System.in);

        System.out.print("请输入用户名:");
        String username = s.nextLine();

        System.out.print("请输入密码:");
        String password = s.nextLine();

        Map<String,String> userLoginInfo = new HashMap<>();

        userLoginInfo.put("username",username);
        userLoginInfo.put("password",password);

        return userLoginInfo;
    }
}

3. 运行结果:


如果不是输入我们数据库表中的用户信息,就会导致身份验证失败!

4. 目前这里存在bug(SQl注入)!我可以输入一个不正确的信息也能登录进去。如下:

posted @ 2020-04-21 14:00  Jadyao  阅读(409)  评论(0)    收藏  举报