已有101人关注
(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编辑
分享到:
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照