这两天正式开始了JAVA项目,主要是制作了上次已经实现过的登录注册界面及跳转,在这个基础了还添加了一些东西,实现了简单版的界面连接数据库,通过读取键盘在文本框敲出的数据来实现数据库的存储从而完成注册功能,通过对数据库中内容的读取来实现登录功能。
登录时账号密码的判断(根据rs的返回值通过if语句来判断登录成功或者失败)
String id = Id.getText();
System.out.println(id);
String password=Password.getText();
System.out.println(password);
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/chatroom","root","050710xxx");
Statement stmt=conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from clients where id='" + id + "' and password='" + password + "'");
登录成功之后的聊天室界面还未实现
账号密码不匹配就会弹出相应提示界面
ButtonLogin.addEventHandler(MouseEvent.MOUSE_CLICKED,new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent mouseEvent){
Stage stage1=(Stage) ButtonLogin.getScene().getWindow();
stage1.close();
URL url=getClass().getResource("../fxml/Loginfault.fxml");
System.out.println(url);
Parent root=null;
try{
root= FXMLLoader.load(url);
}catch(IOException e){
e.printStackTrace();
}
Scene scene =new Scene(root,580,400);
Stage stage=new Stage();
stage.setTitle("Wrong");
stage.initStyle(StageStyle.UTILITY);
stage.setScene(scene);
stage.show();
}
});
}
rs.close();
stmt.close();
conn.close();
}
注册时输入完相应的数据后进行存储(还未实现正则表达式):
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/chatroom","root","050710xxx");
String sql = "INSERT INTO clients VALUES ('" + name + "','" + id + "','" + password + "','" + email + "')";
添加完界面之后还要添加相应的控制类来完成跳转功能:
<AnchorPane prefHeight="400.0" prefWidth="580.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.LoginfaultController">
还简单学习了一下加密算法:
对于加密算法实现的思路:
md5加密不可逆,加密之后数据库里的数据都会改变成加密后的内容(一堆乱七八糟的东西),会导致原来的账号密码无法登录,必须在注册放进数据库之前把加密前的传给登录界面(用一个东西来接接收),注册完成之后在登录界面输入原来的账号密码(通过代码实现将传过来的明文进行加密,判断与数据库里的加密账号密码是否相等,相等就跳转)。
加密算法的简答代码实现:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
// 加密方法:接收一个字符串明文,返回使用 MD5 加密后的哈希值
public static String encrypt(String plaintext) throws NoSuchAlgorithmException {
// 使用 MD5 算法创建 MessageDigest 对象
MessageDigest md = MessageDigest.getInstance("MD5");
// 更新 MessageDigest 对象中的字节数据
md.update(plaintext.getBytes());
// 对更新后的数据计算哈希值,存储在 byte 数组中
byte[] digest = md.digest();
// 将 byte 数组转换为十六进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
// 返回十六进制字符串
return sb.toString();
}
// 解密方法:接收一个字符串明文和一个使用 MD5 加密后的哈希值,返回解密结果(true 表示匹配,false 表示不匹配)
public static boolean decrypt(String plaintext, String encrypted) throws NoSuchAlgorithmException {
// 调用加密方法计算出明文的哈希值
String decrypted = encrypt(plaintext);
// 比较计算得到的哈希值和输入的哈希值是否相同
return decrypted.equals(encrypted);
}
}
junit测试:
import java.security.NoSuchAlgorithmException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class MD5UtilTest {
/**
* 测试加密
* */
@Test
public void testEncrypt() throws NoSuchAlgorithmException {
String plaintext = "hello world";
String expected = "5eb63bbbe01eeed093cb22bb8f5acdc3";
//进行加密
String actual = MD5Util.encrypt(plaintext);
Assertions.assertEquals(expected, actual);
System.out.println("加密是否成功:"+expected.equals(actual));
}
/**
* 进行解密
* */
@Test
public void testDecrypt() throws NoSuchAlgorithmException {
String plaintext = "hello world";
String encrypted = "5eb63bbbe01eeed093cb22bb8f5acdc3";
boolean expected = true;
boolean actual = MD5Util.decrypt(plaintext, encrypted);
Assertions.assertEquals(expected, actual);
System.out.println("解密是否成功:"+actual);
}
}
后几天的规划:
学习加密算法并简单实现
学习实现发送邮箱验证码