java登陆界面中关于JDBC的一个问题

      最近用java写了一个登陆的小界面,先把代码贴出来然后说说其中的问题。

import java.awt.Container;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;


public class Log extends  JFrame {


public Log(){
init();
}
private JLabel labname;
private JLabel labpass;
private JTextField jtf;
private JPasswordField jpf;
private JButton btnok;
private JButton btncancel;

private void init() {
//点击关闭按钮退出程序
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//不允最大化和改变尺寸
this.setResizable(false);
this.setTitle("登陆界面");
this.setLayout(null);
this.setSize(273,170);
//让界面处于屏幕中心
int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
this.setLocation(width/2 - this.getWidth()/2,
            height/2 - this.getHeight()/2);

Container con = this.getContentPane();
labname = new JLabel("用户名:");
labpass = new JLabel("密码:");

labname.setBounds(30, 25, 60, 25);
labpass.setBounds(30, 55, 60, 25);
con.add(labname);
con.add(labpass);

jtf = new JTextField();
jtf.setBounds(85, 25, 150, 25);
jpf = new JPasswordField();
jpf.setBounds(85, 55, 150, 25);
con.add(jtf);
con.add(jpf);

btnok = new JButton("确定");
btncancel = new JButton("取消");
btnok.setBounds(35, 95, 80, 25);
btncancel.setBounds(145, 95, 80, 25);
con.add(btnok);
con.add(btncancel);
//添加按钮事件响应
btnok.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
String passname = jtf.getText();
if("".equals(passname)){
JOptionPane.showMessageDialog(null, "请输入账号");
return ;
}

String pass = new String(jpf.getPassword());
if("".equals(pass)){
JOptionPane.showMessageDialog(null, "请输入密码");
return ;
}
try {
//加载数据库的驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立数据库的连接
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
//一个Connection就是一个数据库连接,这时已经登陆上了数据库
Connection conn = DriverManager.getConnection(url,"scott","tiger");
//执行SQL语句
String sql = "select count(1) from accont where name='"+passname+"' and code='"+pass+"'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
int result = -1;
while(rs.next()){
result = rs.getInt(1);
}
//关闭连接
rs.close();
stmt.close();
conn.close();

if(result > 0){
System.out.println("登陆成功");
//隐藏登陆界面代码,不明白为什么不能用this?
//setVisible(false);
//执行其他代码
//..............
}else{
JOptionPane.showMessageDialog(null, "帐号或密码错误,请重新输入");
jpf.setText(""); 
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

btncancel.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
int result = JOptionPane.showConfirmDialog(Log.this, "确认要退出吗?", "提示",JOptionPane.YES_NO_OPTION);
if(JOptionPane.YES_OPTION == result){
System.exit(0);
}

}
});
}
public static void main(String[] args) {
Log l = new Log();
l.setVisible(true);
}


}
      这个是做的一个简单的登陆界面,使用了数据库中数据进行认证,我在accont表中设置了列名为name和code的两列,存储了三条测试数据(zhangsan 123456;lisi 123;wangu 456),  然后发现了一条神一样的密码:*****' or 1=1--'  (*代码任何字符) ,账户可以是任意的,看了几本JDBC的书中介绍的也是用按照String sql = "select count(1) from accont where name='"+passname+"' and code='"+pass+"'";做的SQL语句,但是忽略了经典的SQL注入,在我们设计java连接数据库时应该尽量避免这样的写法,java本身提供了一种在某种程度提高效率的执行SQL语句的方法,可能也没想到竟然还有防止sql注入的作用,java的另外一种方法是String sql = "select count(1) from accont where passname=? and pass=?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, account.getAccName());pstmt.setString(2, account.getAccPass());rs = pstmt.executeQuery();  这样的sql语句是无论什么类型都用?占位符取代,然后通过set方法给参数赋值,提高了一定的安全性....


深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题
好的,我可以帮你解决这个问题。基于Java语言的登陆界面可以使用JFrame实现用户界面,使用JDBC连接数据库进行用户认证和授权。以下是Java代码示例,希望能帮到你: ``` import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class Login extends JFrame implements ActionListener { private JLabel label1, label2; private JTextField field; private JPasswordField passwordField; private JButton button; public Login() { super("用户认证"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(250, 150); this.setLocationRelativeTo(null); this.setResizable(false); this.setLayout(new BorderLayout()); JPanel panel = new JPanel(new GridLayout(3, 1)); this.add(panel, BorderLayout.CENTER); JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT)); label1 = new JLabel("用户名:"); panel1.add(label1); field = new JTextField(15); panel1.add(field); panel.add(panel1); JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEFT)); label2 = new JLabel("密 码:"); panel2.add(label2); passwordField = new JPasswordField(15); passwordField.setEchoChar('*'); panel2.add(passwordField); panel.add(panel2); JPanel panel3 = new JPanel(new FlowLayout()); button = new JButton("登录"); button.addActionListener(this); panel3.add(button); panel.add(panel3); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { String user = field.getText(); String pwd = new String(passwordField.getPassword()); if (user.length() == 0 || pwd.length() == 0) { JOptionPane.showMessageDialog(null, "用户名或密码不能为空", "提示", JOptionPane.ERROR_MESSAGE); } else { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password); String sql = "SELECT * FROM userinfo WHERE username = ? AND password = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, user); statement.setString(2, pwd); ResultSet rs = statement.executeQuery(); if (rs.next()) { JOptionPane.showMessageDialog(null, "登陆成功", "提示", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "用户名或密码错误", "提示", JOptionPane.ERROR_MESSAGE); } rs.close(); statement.close(); connection.close(); } catch (ClassNotFoundException ex) { JOptionPane.showMessageDialog(null, "未找到MySQL JDBC驱动", "提示", JOptionPane.ERROR_MESSAGE); } catch (SQLException ex) { JOptionPane.showMessageDialog(null, "数据库连接失败", "提示", JOptionPane.ERROR_MESSAGE); } } } } public static void main(String[] args) { new Login(); } } ``` 这里我们使用MySQL数据库进行用户认证,如果用户名和密码输入正确,程序就给出"登陆成功"的提示,否则提示"用户名或密码错误"。当然,这个示例只是简单的演示了登陆界面的实现,你可以根据需要进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值