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方法给参数赋值,提高了一定的安全性....


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:使用AngularJs编写的简单 益智游戏(附源代码)  这是一个简单的 javascript 项目。这是一个拼图游戏,也包含一个填字游戏。这个游戏玩起来很棒。有两个不同的版本可以玩这个游戏。你也可以玩填字游戏。 关于游戏 这款游戏的玩法很简单。如上所述,它包含拼图和填字游戏。您可以通过移动图像来玩滑动拼图。您还可以选择要在滑动面板拥有的列数和网格数。 另一个是填字游戏。在这里你只需要找到浏览器左侧提到的那些单词。 要运行此游戏,您需要在系统上安装浏览器。下载并在代码编辑器打开此项目。然后有一个 index.html 文件可供您修改。在命令提示符运行该文件,或者您可以直接运行索引文件。使用 Google Chrome 或 FireFox 可获得更好的用户体验。此外,这是一款多人游戏,双方玩家都是人类。 这个游戏包含很多 JavaScript 验证。这个游戏很有趣,如果你能用一点 CSS 修改它,那就更好了。 总的来说,这个项目使用了很多 javascript 和 javascript 库。如果你可以添加一些具有不同颜色选项的级别,那么你一定可以利用其库来提高你的 javascript 技能。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值