(JAVA码Python)每天编程一小时: 动态验证码
发表在Java图书答疑
2020-03-07
《零基础学Java》第11章 Swing程序设计
是否精华
是
否
版块置顶:
是
否
最近没有JAVA每天编程一小时,只好借用Python的了
任务:https://zyk.mingrisoft.com/OneHour/detail/type/1/id/213.html
随着大数据和人工智能技术的发展,普通验证码很容易被破解。如何提高验证码的破解难度,保护用户账户和资金的安全呢?使用动态验证码技术是一种比较好的方式,动态验证码如图所示。编写一个程序,实现动态验证码,其实动态验证码是一个GIF动画,用户将动画中的验证码输入到验证码输入框,如果验证正确,提示“验证通过,将退出系统!”,否则提示“验证码不正确,请重新输入!”。运行效果如下图所示。
以下是JAVA代码
import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.*; public class Test extends JFrame { JTextField text;// 文本输入框 JLabel jlCap;// 验证码图片标签 int num;// 定义随机数变量 public static List<String> capList = new ArrayList<String>();// 定义验证码内容集合 static {// 添加验证码图片字符内容的静态代码块 capList.add("36uad"); capList.add("eun2p"); capList.add("tgy19"); capList.add("1tt8i"); capList.add("1gria"); capList.add("4gsah"); capList.add("2q6gy"); capList.add("2gnf7"); capList.add("q4q1y"); capList.add("5qhi6"); capList.add("1ferh"); capList.add("wtyiq2"); capList.add("5ttyi"); } public Test() {// 构造方法初始化窗体 setTitle("动态验证码");// 窗体标题 setSize(450, 160);// 窗体大小 setLocationRelativeTo(null);// 窗体居中 setVisible(true);// 窗体可见 setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭方式 Container c = getContentPane();// 获取容器 c.setLayout(null);// 设置绝对布局 Font font = new Font("仿宋", Font.BOLD, 15);// 统一设置字体 Icon icon = new ImageIcon("image/sport.png"); JLabel jl1 = new JLabel(icon);// 新增会员标签 jl1.setBounds(10, 10, 97, 19); // 设置位置及大小 JLabel jl2 = new JLabel("请输入验证码:");// 文字标签 jl2.setFont(font); jl2.setBounds(10, 45, 115, 20); this.text = new JTextField();// 文本输入框 this.text.setFont(font); this.text.setBounds(125, 43, 80, 24); this.jlCap = new JLabel();// 验证码图片标签 changeCap();// 设置标签的图片 this.jlCap.setBounds(205, 35, 133, 39); JButton change = new JButton("换一张"); change.setFont(font); change.setBounds(340, 42, 85, 26); // 换图按钮 change.setBorderPainted(false);// 设置按钮无边框 JButton enter = new JButton("确认");// 确认按钮 enter.setFont(font); enter.setBounds(240, 80, 70, 26); JButton quit = new JButton("退出");// 退出按钮 quit.setFont(font); quit.setBounds(340, 80, 70, 26); // 向容器添加所有标签按钮等组件 c.add(jl1); c.add(jl2); c.add(this.text); c.add(this.jlCap); c.add(change); c.add(enter); c.add(quit); change.addActionListener(new ActionListener() {// 换图按钮触发事件 @Override public void actionPerformed(ActionEvent args) { changeCap(); } }); enter.addActionListener(new ActionListener() {// 确定按钮触发事件匿名内部类 @Override public void actionPerformed(ActionEvent args) { if (ifCap(getNum(), text.getText())) {// 验证码正确则弹出 //正确对话框,否则弹出错误对话框 JOptionPane.showMessageDialog(null, "验证通过,将登入 系统!", "动态验证码", JOptionPane.WARNING_MESSAGE); System.exit(0);// 退出程序 } else { JOptionPane.showMessageDialog(null, "验证码不正确,请 重新输入!", "动态验证码", JOptionPane.ERROR_MESSAGE); changeCap();// 更换验证码图片 } } }); quit.addActionListener(new ActionListener() {// 退出按钮触发事件 @Override public void actionPerformed(ActionEvent args) { System.exit(0);// 退出程序 } }); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public void changeCap() {// 更换验证码图片方法 setNum((int) (Math.random() * capList.size()));// 生成随机数 jlCap.setIcon(new ImageIcon("image/cap/验证码" + getNum() + ".gif"));//重设图片 text.setText("");// 文本框清空 text.requestFocus();// 文本框鼠标聚焦 } public boolean ifCap(int num, String cap) {// 验证输入验证码是否正确 return capList.get(num).equals(cap.toLowerCase());// 返回比较结果 } public static void main(String[] args) { new Test(); } }
于2020-03-07 23:25:03编辑