输入账号和密码,在数据库中获取,如果有该信息,则显示其登陆成功,如果没有,则显示输入错误
有两种方法可以实现:
import java.sql.*; import java.util.*; public class Login { public static void main(String[] args) throws Exception { // 输入用户名和密码 Scanner sc=new Scanner(System.in); System.out.println("请输入账号"); String zh=sc.nextLine(); System.out.println("请输入密码"); String mm=sc.nextLine(); // zh=zh.replaceAll("\'", "\""); //替换 // mm=mm.replaceAll("\'", "\""); //替换 //到数据库验证用户名和密码是否正确 Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", ""); Statement state=conn.createStatement(); String sql="select * from yonghu where zhanghao='"+zh+"' and mima='"+mm+"'"; ResultSet re=state.executeQuery(sql); //输出:正确显示欢迎,不正确显示错误 if(re.next()){ System.out.println("登陆成功!"+re.getString(3)+" 欢迎你"); } else{ System.out.println("输入账号或密码错误"); } conn.close(); } }
实现了该功能
但是如果我们输入
同样会显示登陆成功(sql注入攻击),为避免出现这种情况我们加入两个替换
zh=zh.replaceAll("\'", "\"") 将输入的所有单引号全部换成双引号,就可以避免这样的漏洞;但是这种方法治标不治本,根本原因是字符串的拼接的原因

从根本上解决问题还有一种写法 在SQL语句中,不确定的条件用?代替,PreparedStatement(sql) 容器来装 setString( n ,m)来赋值n是第几个问号的位置,m是赋的值(数据的增删改同样适用这种方法)
import java.sql.*; import java.util.*; public class Login { public static void main(String[] args) throws Exception{ //输入用户名和密码 Scanner sc=new Scanner(System.in); System.out.println("请输入账号"); String zh=sc.nextLine(); System.out.println("请输入密码"); String mm=sc.nextLine(); Class.forName("com.mysql.jdbc.Driver"); String jdbc="jdbc:mysql://127.0.0.1:3306/mydb"; Connection conn=DriverManager.getConnection(jdbc, "root", ""); String sql="select * from yonghu where zhanghao=? and mima=?"; //sql语句 PreparedStatement state=conn.prepareStatement(sql); //容器 state.setString(1, zh); //将第n个值替换成某个值 state.setString(2, mm); ResultSet re=state.executeQuery(); //上传数据库返回结果集 if(re.next()){ //如果取到了值,那么输出 System.out.println("登陆成功"+re.getString(3)+",欢迎你"); } else{ System.out.println("登陆失败,账号或密码输入错误"); } }