JDBC-模擬用戶登錄
案例需求:
模擬用戶登錄,Statement對象完成
開發步驟:
1.準備環境,導入JDBCUtils工具類,mysql-connector-java-5.1.10-bin.jar包,JUnit 4 jar包
2.創建main方法,提示用戶登錄
3.創建login方法,用來驗證用戶是否存在,去查詢user表,根據用戶名和密碼,利用jdbc完成,JDBCUtils工具類
方式一:當我們的用戶名輸入的值爲jack’# /jack’ or’1=1’時會產生一新現象:只輸入用戶名不輸入密碼可以登錄成功。
本質上是因爲SQL中出現了SQL關鍵字(# / or),使得SQL語義發生了變化。出現SQL注入攻擊問題,
方式二:給出瞭解決方案,利用PreparedeStatement對象開發,可以成功的避免攻擊問題
總結:1.防止 SQL注入攻擊問題,本質上是將SQL的關鍵字當做一個普通的字符串來處理的。
2.省去了參數拼接的麻煩,利用?來作爲佔位符,將SQL的參數和SQL的骨架分隔開。?的值通過ps.setString(index,username)
3.提高程序的效率,執行sql的時候,先將SQL骨架緩存,減少了數據庫的交互提高程序訪問效率
用戶表:
代碼實現如下
package on.login_用戶登錄;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
import on.tedu.Util_工具類.JDBCUtils;
/**
* 這個類用來模擬用戶登錄
* 開發步驟:
* 1.創建main方法,提示用戶登錄
* 2.創建login方法,用來驗證用戶是否存在
*
* @date 2018年3月26日
*
*/
public class LoginUser {
//1.創建main方法,提示用戶登錄
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請您輸入用戶名:");
String username = sc.nextLine();
System.out.println("請您輸入密碼:");
String password =sc.nextLine();
//2.創建login方法,用來驗證用戶是否存在
login(username,password);
}
//用來驗證用戶是否存在
//去查詢user表,根據用戶名和密碼
private static void login(String username, String password) {
Connection conn=null;
Statement st=null;
ResultSet rs=null;
//利用可以防止SQL注入攻擊的對象
PreparedStatement ps =null;
try {
//利用jdbc完成,JDBCUtils工具類完成
//1.獲取數據庫連接
conn= JDBCUtils.getConnection();
//2.獲取傳輸器
//st=conn.createStatement();
/**
* 方式一產生了注入攻擊問題 jack'# 和 jack' or '1=1
*/
//3.執行SQL
/* String sql="select * from user where username='"+username+"' and password='"+password+"'";
rs=st.executeQuery(sql);*/
//自己的思路
/* String name=null;
String pass=null;
while(rs.next()){
name=rs.getString(2);
pass=rs.getString(3);
}*/
/**
* 方式二:PerparedStatement對象
* 執行SQL
*/
//利用connection對象產生PerparedStatement預編譯傳輸器對象
//? 叫做佔位符 ,SQL的名字叫做骨架
String sql ="select * from user where username=? and password=?";
ps=conn.prepareStatement(sql);
//設置參數值,數字的順序和 ? 的順序一致
ps.setString(1, username);//匹配第一個?要輸入的值
ps.setString(2, password);
rs= ps.executeQuery();
//4.解析結果集
if(rs.next()){
System.out.println("恭喜您,登錄成功!");
}else{
System.out.println("用戶名和密碼輸入錯誤!請重新輸入");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//5.關閉資源
JDBCUtils.close(conn, st, rs);
}
}
}
運行結果: