【JDBC】笔记(2)
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