百木园-与人分享,
就是让自己快乐。

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

一.实现功能:

    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://www.cnblogs.com/Burning-youth/p/15750210.html
图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 【JDBC】笔记(2)--- 模拟用户登录功能 (javaSE+MySQL+JDBC)[ 应用 Statement ]

相关推荐

  • 暂无文章