【JDBC】笔记(2)

database

1、需求:模拟用户登录功能的实现;2、业务描述:程序运行的时候,提供输入的入口,可以让用户输入用户名和密码;用户输入用户名和密码后,提交信息,java程序收集到用户信息.....

一.实现功能:

    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 ]

 

 

以上是 【JDBC】笔记(2) 的全部内容, 来源链接: utcz.com/z/536212.html

回到顶部