【JDBC】笔记(2)-[通俗易懂]

【JDBC】笔记(2)-[通俗易懂]1、需求:模拟用户登录功能的实现;2、业务描述:程序运行的时候,提供输入的入口,可以让用户输入用户名和密码;用户输入用户名和密码后,提交信息,java程序收集到用户信息…..

【JDBC】笔记(2)-

一.实现功能:

    1、需求:
        模拟用户登录功能的实现
    2、业务描述:
        程序运行的时候,提供输入的入口,可以让用户输入用户名和密码
        用户输入用户名和密码后,提交信息,java程序收集到用户信息
        java程序连接数据库验证用户名和密码是否合法,并显示结果(登录成功/登录失败)
    3、用户信息表
    +—-+———–+———-+———-+
    | id | loginName | loginPwd | realName |
    +—-+———–+———-+———-+
    |  1 | abc       | 123      | 张三     |
    |  2 | wwe       | 456      | 李四     |
    +—-+———–+———-+———-+

 

二.代码实现:

import java.sql.*;
import java.util.*;

/*
实现功能:
    1、需求:
        模拟用户登录功能的实现
    2、业务描述:
        程序运行的时候,提供输入的入口,可以让用户输入用户名和密码
        用户输入用户名和密码后,提交信息,java程序收集到用户信息
        java程序连接数据库验证用户名和密码是否合法,并显示.结果(登录成功/登录失败)
    3、用户信息表
    +----+-----------+----------+----------+
    | id | loginName | loginPwd | realName |
    +----+-----------+----------+----------+
    |  1 | abc       | 123      | 张三     |
    |  2 | wwe       | 456      | 李四     |
    +----+-----------+----------+----------+

 */
public class JDBCTest01 {
    public static void main(String[] args) {
        //初始化界面(用户输入账号和密码)
        Map<String,String> userLoginInfo = initUI();
        //验证用户名和密码(JDBC)
        boolean loginSuccess = login(userLoginInfo);
        //显示结果:
        System.out.println(loginSuccess==true?"登录成功":"登录失败");
    }

    /**
     * 验证用户登录信息是否正确
     * @param userLoginInfo 用户登录信息
     * @return false 表示登录失败,true 表示登录成功
     */
    private static boolean login(Map<String, String> userLoginInfo) {
        //打标记(登录结果)
        boolean loginSuccess = false;

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1、注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2、获取连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode",
                    "root","888");
            //3、获取数据库操作对象
            statement = connection.createStatement();
            //4、执行sql
            String sql = "select * from t_user where loginName = ""+userLoginInfo.get("loginName")+""" +
                    " and loginPwd = ""+userLoginInfo.get("loginPwd")+"" ";
            resultSet = statement.executeQuery(sql);
            //5、处理结果集
            //不需要while结果集,因为查询结果不是 无 就是 1条记录
            if (resultSet.next()){
                loginSuccess = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //从小到大分别关闭三个资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        //最后返回 登录结果(boolean)
        return loginSuccess;
    }

    /**
     * 初始化用户界面
     * @return 用户的用户名和密码(Map)
     */
    private static Map<String, String> initUI() {
        Scanner s=new Scanner(System.in);

        System.out.println("用户名:");
        String loginName = s.nextLine();

        System.out.println("密码:");
        String loginPwd = s.nextLine();

        //用 HashMap(键值对的方式)存储用户输入的 账号和密码
        Map<String,String> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}
 

 

三.效果展示:

1.输入合法的用户名和密码:

点击查看
用户名:
abc
密码:
123
登录成功

Process finished with exit code 0
点击查看
用户名:
wwe
密码:
456
登录成功

Process finished with exit code 0

2.输入不合法的用户名和密码:

点击查看
用户名:
hahaha
密码:
123
登录失败

Process finished with exit code 0
 

 

四.SQL注入现象:

1.用户为:任意字符

  密码为:任意字符” or “1”=”1

用户名:
yyds
密码:
yyds" or "1"="1
登录成功

Process finished with exit code 0

  当用户输入信息为这种情况时,也能登录成功,这种现象叫做 SQL注入现象;因为以上字符正好完成了sql语句的拼接,然后此(本不应该被编译的)sql语句被发送给DBMS,DBMS进行编译,这样正好把用户提供的”非法信息”编译进去,导致原sql语句的含义被扭曲了;

2.总结SQL注入的根本原因是:

用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的原意被扭曲,进而达到sql注入;

3.如何解决SQL注入问题? 

SQL注入问题根本在于”输入的非法信息”不应该被编译,所以只要让用户提供的信息不参与SQL语句的编译,就解决了问题,那么就必须使用 — java.sql.PreparedStatement;

4.java.sql.PreparedStatement:

PreparedStatement 接口继承了 java.sql.PreparedStatement;

PreparedStatement 属于预编译的数据库对象;

PreparedStatement 的原理是:预先对SQL语句的框架进行编译,然后再给SQL语句传值;

 

改进后的登录系统代码:【JDBC】笔记(3)— 提高用户登录功能的安全性 (javaSE+MySQL+JDBC)[ 应用 PreparedStatement ]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5579.html

(0)
上一篇 2023-05-03
下一篇 2023-05-03

相关推荐

  • Python字典遍历

    Python字典遍历Python是一种解释型、面向对象、动态数据类型的高级编程语言,与其他编程语言相比,Python的优势在于语法简洁、易读易写。Python内建了字典(Dictionary)数据类型,字典是一种可变的键值对集合,每个键与其相应值之间是一一对应的关系。

    2024-04-14
    22
  • 在终端中运行Python脚本

    在终端中运行Python脚本Python是一个高级编程语言,常用于快速开发Web应用、科学计算、自动化任务等。Python脚本在本地运行可以让我们更加方便地进行代码测试和调试,另外Python的平台独立性也让Python成为跨平台开发的理想选择。但是在一些情况下,我们需要在终端中运行Python脚本。

    2023-12-29
    58
  • MYSQL思维导图

    MYSQL思维导图学习MYsql是的方向是很重要的,为此,我自发做了思维导图供大家学习,此部分仅仅是基础部分,扩展以后我会补充。

    2022-12-18
    103
  • 数据库死锁排查及处理方法视频_数据库的死锁会一直等待

    数据库死锁排查及处理方法视频_数据库的死锁会一直等待MySQL查看死锁和解除锁 的两种方法 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程。否…

    2023-02-25
    96
  • MongoDB复制集RS(ReplicationSet)「建议收藏」

    MongoDB复制集RS(ReplicationSet)「建议收藏」MongoDB复制集RS(ReplicationSet) 1.基本原理 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))如果…

    2023-03-30
    113
  • mysql 基于mysql-proxy实现读写分离

    mysql 基于mysql-proxy实现读写分离mysql读写分离读写分离首先不推荐使用,很多业务场景也没有必要,不仅增加技术复杂度,而且可能会导致读到落后的数据,建议优化数据库,推荐使用keepalive+mysql双主复制的方案然后mysql…

    2023-03-28
    113
  • 优化Linux环境变量,加速Python程序

    优化Linux环境变量,加速Python程序Linux作为一种高效的操作系统,可以提供快速的运行环境。但是,随着用户数量和数据量的增加,大量的环境变量会降低系统性能,并使进程的启动速度变慢。可以通过以下方法来优化环境变量:

    2024-01-02
    63
  • MySQL定时备份(全量备份+增量备份)[亲测有效]

    MySQL定时备份(全量备份+增量备份)[亲测有效]MySQL 定时备份 参考 zone7_ 的 实战-MySQL定时备份系列文章 参考 zmcyu 的 mysql数据库的完整备份、差异备份、增量备份 更多binlog的学习参考马丁传奇的 MySQL…

    2023-02-01
    101

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注