【JDBC】笔记(2)— 模拟用户登录功能 (javaSE+MySQL+JDBC)[ 应用 Statement ]

一.实现功能:

1、需求:
模拟用户登录功能的实现
2、业务描述:
当程序运行时,它为用户输入用户名和密码提供了一个入口点。

[En]

When the program is running, it provides an entry point for the user to enter a user name and password.

用户输入用户名和密码后,提交信息,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();
        //&#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#xFF08;JDBC&#xFF09;
        boolean loginSuccess = login(userLoginInfo);
        //&#x663E;&#x793A;&#x7ED3;&#x679C;&#xFF1A;
        System.out.println(loginSuccess==true?"&#x767B;&#x5F55;&#x6210;&#x529F;":"&#x767B;&#x5F55;&#x5931;&#x8D25;");
    }

    /**
     * &#x9A8C;&#x8BC1;&#x7528;&#x6237;&#x767B;&#x5F55;&#x4FE1;&#x606F;&#x662F;&#x5426;&#x6B63;&#x786E;
     * @param userLoginInfo &#x7528;&#x6237;&#x767B;&#x5F55;&#x4FE1;&#x606F;
     * @return false &#x8868;&#x793A;&#x767B;&#x5F55;&#x5931;&#x8D25;&#xFF0C;true &#x8868;&#x793A;&#x767B;&#x5F55;&#x6210;&#x529F;
     */
    private static boolean login(Map<string, string> userLoginInfo) {
        //&#x6253;&#x6807;&#x8BB0;&#xFF08;&#x767B;&#x5F55;&#x7ED3;&#x679C;&#xFF09;
        boolean loginSuccess = false;

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1&#x3001;&#x6CE8;&#x518C;&#x9A71;&#x52A8;
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2&#x3001;&#x83B7;&#x53D6;&#x8FDE;&#x63A5;
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode",
                    "root","888");
            //3&#x3001;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x5BF9;&#x8C61;
            statement = connection.createStatement();
            //4&#x3001;&#x6267;&#x884C;sql
            String sql = "select * from t_user where loginName = '"+userLoginInfo.get("loginName")+"'" +
                    " and loginPwd = '"+userLoginInfo.get("loginPwd")+"' ";
            resultSet = statement.executeQuery(sql);
            //5&#x3001;&#x5904;&#x7406;&#x7ED3;&#x679C;&#x96C6;
            //&#x4E0D;&#x9700;&#x8981;while&#x7ED3;&#x679C;&#x96C6;&#xFF0C;&#x56E0;&#x4E3A;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;&#x4E0D;&#x662F; &#x65E0; &#x5C31;&#x662F; 1&#x6761;&#x8BB0;&#x5F55;
            if (resultSet.next()){
                loginSuccess = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //&#x4ECE;&#x5C0F;&#x5230;&#x5927;&#x5206;&#x522B;&#x5173;&#x95ED;&#x4E09;&#x4E2A;&#x8D44;&#x6E90;
            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();
                }
            }

        }
        //&#x6700;&#x540E;&#x8FD4;&#x56DE; &#x767B;&#x5F55;&#x7ED3;&#x679C;&#xFF08;boolean&#xFF09;
        return loginSuccess;
    }

    /**
     * &#x521D;&#x59CB;&#x5316;&#x7528;&#x6237;&#x754C;&#x9762;
     * @return &#x7528;&#x6237;&#x7684;&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#xFF08;Map&#xFF09;
     */
    private static Map<string, string> initUI() {
        Scanner s=new Scanner(System.in);

        System.out.println("&#x7528;&#x6237;&#x540D;&#xFF1A;");
        String loginName = s.nextLine();

        System.out.println("&#x5BC6;&#x7801;&#xFF1A;");
        String loginPwd = s.nextLine();

        //&#x7528; HashMap&#xFF08;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x65B9;&#x5F0F;&#xFF09;&#x5B58;&#x50A8;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684; &#x8D26;&#x53F7;&#x548C;&#x5BC6;&#x7801;
        Map<string,string> userLoginInfo = new HashMap<>();
        userLoginInfo.put("loginName",loginName);
        userLoginInfo.put("loginPwd",loginPwd);

        return userLoginInfo;
    }
}
 </string,string></string,></string,></string,string>

三.效果展示:

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

点击查看

&#x7528;&#x6237;&#x540D;&#xFF1A;
abc
&#x5BC6;&#x7801;&#xFF1A;
123
&#x767B;&#x5F55;&#x6210;&#x529F;

Process finished with exit code 0

点击查看

&#x7528;&#x6237;&#x540D;&#xFF1A;
wwe
&#x5BC6;&#x7801;&#xFF1A;
456
&#x767B;&#x5F55;&#x6210;&#x529F;

Process finished with exit code 0

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

点击查看

&#x7528;&#x6237;&#x540D;&#xFF1A;
hahaha
&#x5BC6;&#x7801;&#xFF1A;
123
&#x767B;&#x5F55;&#x5931;&#x8D25;

Process finished with exit code 0

四.SQL注入现象:

1.用户为:任意字符

密码为:任意字符’ or ‘1’=’1

&#x7528;&#x6237;&#x540D;&#xFF1A;
yyds
&#x5BC6;&#x7801;&#xFF1A;
yyds' or '1'='1
&#x767B;&#x5F55;&#x6210;&#x529F;

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语句传值;

Original: https://www.cnblogs.com/Burning-youth/p/15750210.html
Author: 猿头猿脑的王狗蛋
Title: 【JDBC】笔记(2)— 模拟用户登录功能 (javaSE+MySQL+JDBC)[ 应用 Statement ]

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507906/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • podman

    podman Podman 是一个无守护程序、开源的 Linux 原生工具,旨在使用开放容器计划 (OCI) 容器和容器映像轻松查找、运行、构建、共享和部署应用程序。Podman …

    数据库 2023年6月14日
    084
  • python自动安装mysql5.7

    python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以自己修改 这个脚本…

    数据库 2023年6月9日
    0170
  • 在线安装Docker

    安装 yum-utils 包yum install -y yum-utils 设置存储库# 官方地址(比较慢) yum-config-manager \ –add-repo \ …

    数据库 2023年6月14日
    092
  • mysql入门到精通完整学习教程,基础入门-数据库实战

    Original: https://www.cnblogs.com/chaichaichai/p/15662164.htmlAuthor: 牛仔码农Title: mysql入门到精…

    数据库 2023年5月24日
    0101
  • 实现一个简单的Database2(译文)

    前文回顾:实现一个简单的Database1(译文) 译注:cstsck在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运…

    数据库 2023年6月11日
    0108
  • Mysql数据库服务端的安装

    一般提到Mysql数据库的安装在工作当中是说的安装数据库管理软件的服务端,服务端的安装可以安装在Windows环境,也可以安装在Linux环境。 Windows环境安装:目前安装比…

    数据库 2023年6月6日
    095
  • hosts文件作用

    1、加快域名解析对于要经常访问的网站,我们可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。由于有了映射关系,当我们输入域名计算机就能很快解析出IP,而不用请求网络…

    数据库 2023年6月11日
    066
  • Windows10 下使用 telnet 命令

    正常情况下 windows 是使用不了 telnet 命令的: 打开控制面板-》程序和功能-》启用或关闭 Windows 功能 勾选 “Telnet客户端”…

    数据库 2023年6月14日
    080
  • 希望腿上的伤快点好

    明天去星巴克泡一会儿想把一些课程关联到的课程学习一下 Original: https://www.cnblogs.com/ukzq/p/16747859.htmlAuthor: D…

    数据库 2023年6月11日
    095
  • 从学校到公司,2022新的起点!!!

    步入新的阶段 目前仍然是大学生的身份,但也算是打工人了。2021秋招时来到了天津的一个公司做实习生,并签订了三方协议。已经来公司将近一个月了,我在这段时间想了很多关于我的未来发展方…

    数据库 2023年6月6日
    075
  • 做自动化测试选择Python还是Java?

    你好,我是测试蔡坨坨。 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件…

    数据库 2023年6月11日
    0106
  • 数据结构与算法-农夫过河问题

    农夫过河问题——最短路径算法 问题描述:农夫用小木筏将狼、羊、菜从起始岸运到目标岸,小木筏每次只能带一种物品,也可以什么都不带,因为食物链的关系,人不在的时候,狼会吃羊,羊会吃菜,…

    数据库 2023年6月14日
    0112
  • 绘制几何图形

    《零基础学Java》 绘制几何图形Java可以 分别使用 Graphics 和 Graphics2D 绘制图形, Graphics类 使用不同的方法绘制不同的图形(drawLine…

    数据库 2023年6月16日
    0105
  • zabbix模板,角色,用户,权限管理

    用户管理 用户组 用户角色 用户 模板管理 模板组 模板 posted @2022-09-07 22:22 溜溜威 阅读(16 ) 评论() 编辑 Original: https:…

    数据库 2023年6月14日
    0107
  • Tomcat的关于Web应用的类加载器

    类加载器的补充 一 类加载器的结构 二 类加载器的源码 源码视频 ClassLoader: 类加载器的基础实现,双亲委派就是这里实现的 SecureClassLoader: 安全相…

    数据库 2023年6月11日
    075
  • FastDFS客户端与django自定义文件存储系统

    1. FastDFS的Python客户端 python版本的FastDFS客户端使用说明参考https://github.com/jefforeilly/fdfs_client-p…

    数据库 2023年6月14日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球