Java案例——实现验证码登陆

阅读: 评论:0

Java案例——实现验证码登陆

Java案例——实现验证码登陆

简介

作者简介:青铜码农,和大多数同学一样从零开始一步步学习,一步步积累。期待您的关注,让我们一起成长~注:本人学疏才浅,文章如有错误之处,敬请指正~

内容简介:为了保证登陆的安全性,通常会要求在登陆界面中输入验证码。本内容主要讲解如何使用Java语言实现验证码登陆功能。

获取完整源码及图片素材:

链接: 
提取码:pncz

功能预览:

Java实现验证码功能

为了方便,此处只当用户名为123456,且密码为123456时就登陆成功。
    由功能预览可知:当输入的用户名、密码都正确时将提示登陆成功;没有输入用户名将提示用户名为空,密码、验证码也是如此;且当输入的用户名或者密码有误时,会提示用户名或密码错误,且当错误达到三次时,登陆按钮将被禁用,登陆按钮显示XX秒后重试;每次登陆成功或信息有误时,验证码都会更新一次;验证码不区分大小写。点击重置按钮,所有信息将被清空,验证码会刷新;点看不清按钮,将更换验证码。

1.创建窗体类
   创建一个类继承于JFrame,在实现方法中添加组件和按钮监听事件,在main方法中实例化类并设置窗体可见。代码如下:

public class yanzhengma extends JFrame {private JTextField nameText;// 用户名输入框private JPasswordField pwdText;// 密码输入框private JTextField codeText;// 验证码输入框private JButton button_1;// 登陆按钮
​public yanzhengma() {super();setResizable(false);setTitle("Java实现验证码功能");setBounds(700, 450, 400, 200);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
​JPanel panel = new JPanel();panel.setLayout(null);getContentPane().add(panel, BorderLayout.CENTER);
​JLabel label_1 = new JLabel();label_1.setText("用户名:");label_1.setBounds(10, 10, 50, 20);panel.add(label_1);
​nameText = new JTextField();nameText.setBounds(60, 10, 300, 20);panel.add(nameText);
​JLabel label_2 = new JLabel();label_2.setText("密 码:");label_2.setBounds(10, 35, 50, 20);panel.add(label_2);
​pwdText = new JPasswordField();pwdText.setBounds(60, 35, 300, 20);panel.add(pwdText);
​JLabel label_3 = new JLabel();label_3.setText("验证码:");label_3.setBounds(10, 75, 50, 20);panel.add(label_3);
​codeText = new JTextField();codeText.setBounds(60, 70, 80, 30);panel.add(codeText);
​button_1 = new JButton("登陆");button_1.setBounds(30, 110, 80, 20);panel.add(button_1);button_1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String username = Text();// 从文本框中获取用户名String password = new Password());// 从密码框中获取密码String code = Text().toUpperCase();// 获得输入的验证码,并转换为大写字母String info = "";// 提示信息// 判断用户名是否为null或空的字符串if (username == null || username.isEmpty()) {info = "用户名为空!";}// 判断密码是否为null或空的字符串else if (password == null || password.isEmpty()) {info = "密码为空!";}// 判断验证码是否为null或空的字符串else if (code == null || code.isEmpty()) {info = "验证码为空!";}// 如果用户名与密码均为"123456",则登录成功else if (username.equals("123456") && password.equals("123456")) {info = "登录成功!";} else {info = "用户名或密码错误!";}JOptionPane.showMessageDialog(null, info);// 通过对话框弹出用户登录信息}});
​JButton button_2 = new JButton("重置");button_2.setBounds(130, 110, 80, 20);panel.add(button_2);button_2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {nameText.setText("");// 清空用户名文本框pwdText.setText("");// 清空密码框codeText.setText("");// 清空验证码框}});
​JButton button_3 = new JButton("看不清");button_3.setBounds(230, 110, 80, 20);panel.add(button_3);button_3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//待补充的代码}});}
​public static void main(String[] args) {yanzhengma frame = new yanzhengma();frame.setVisible(true);// 窗体}
}

运行效果如图:

2.创建验证码面板类

在此类中规定作为随机验证码的26个字母;在面板中绘制出随机输出的验证码字母;验证码需要随机调整角度,大小。代码如下:

class CodePanel extends JPanel {Random random = new Random();// 随机数实例化private String code = "";// 验证码
​public CodePanel() {this.setVisible(true);setLayout(null);}
​public void paint(Graphics g) {String wenzi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 验证码的字母BufferedImage image = new BufferedImage(120, 35, BufferedImage.TYPE_INT_BGR);Graphics graphics = Graphics();if (!code.isEmpty()) {code = "";}graphics.setFont(new Font("楷体", Font.BOLD, 20));graphics.fillRect(0, 0, 120, 35);
​for (int i = 0; i < 4; i++) {//生成四个待验证的文字int index = Int(wenzi.length());String s = wenzi.substring(index, index + 1);// 截取字段code += s;// 验证码新增截取字段graphics.);Graphics2D g2d = (Graphics2D) graphics;AffineTransform transform = new AffineTransform();Int(45) * 3.14 / 180, 22 * i + 8, 7);// 随机转动float scaleSize = Float() + 0.8f;// 缩放文字if (scaleSize > 1f)scaleSize = 1f;// 如果scaleSize大于1,则等于1transform.scale(scaleSize, scaleSize); // 进行缩放g2d.setTransform(transform);// 设置AffineTransform对象graphics.drawString(s, 120 / 6 * i + 28, 35 / 2);// 画出验证码}g.drawImage(image, 0, 0, null);}
​public void draw() {repaint();// 重新绘制验证码}
​public String getNum() {return code;// 返回验证码}
}

并在yanzhengma类中补充一下新代码:

public class yanzhengma extends JFrame {
// 用户名输入框
// 密码输入框
// 验证码输入框
// 登陆按钮private CodePanel codePanel = null;private int num = 0;// 计数器
​public yanzhengma() {//此处省略不作改变代码codePanel = new CodePanel();codePanel.setBounds(150, 67, 100, 35);getContentPane().add(codePanel);
​//此处省略不作改变代码// 如果用户名与密码均为"123456",则登录成功else if (username.equals("123456") && password.equals("123456")) {info = "登录成功!";codePanel.draw();// 更新验证码} else {info = "用户名或密码错误!";num++;if (num == 3) {button_1.setEnabled(false);// 设置计时任务 1s 循环5次 停止任务Timer timer = new Timer();timer.schedule(new TimerTask() {int i = 5;
​@Overridepublic void run() {i--;button_1.setText(i + "秒");if (i <= 0) {button_1.setEnabled(true);// 设置按钮可点击 并且停止任务button_1.setText("登陆");codePanel.draw();// 更新验证码timer.cancel();}}}, 0, 1000);}}JOptionPane.showMessageDialog(null, info);// 通过对话框弹出用户登录信息}});
​//此处省略不作改变代码
​JButton button_3 = new JButton("看不清");button_3.setBounds(230, 110, 80, 20);panel.add(button_3);button_3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (codePanel != null) {codePanel.draw();// 更新验证码}}});}
​public static void main(String[] args) {//此处省略不作改变代码}
}

至此,该功能已实现完毕,效果如上视频所示。类似的,可以将26个字母换成指定文字。也可以实现运算功能的验证码。

如果想验证码框带图片,可在CodePanel类中的paint()方法添加一下代码:

    public void paint(Graphics g) {//此处省略不作改变代码
​Image bgImage=null;try {bgImage= ad(new File("src/image.jpg"));} catch (IOException e) {e.printStackTrace();}
​Graphics().drawImage(bgImage,0,0,120,35,null);
​for (int i = 0; i < 4; i++) {//生成四个待验证的文字//此处省略不作改变代码}

运行效果如图:

或者可以在验证码字母中添加干扰线,在CodePanel类中的paint()方法添加一下代码:

        int x1 = Int(20);// 第一条线起始X坐标int x2 = Int(30) + 35;// 第二条线起始X坐标,第一条线的终止X坐标int x3 = Int(30) + 90;// 第二条线的终止X坐标int y1 = Int(20);// 第一条线的Y坐标int y2 = Int(10) + 20;// 第二条线起始Y坐标,第一条线的终止Y坐标int y3 = Int(10) + 5;// 第二条线的终止Y坐标graphics.setColor(Color.black);graphics.drawLine(x1, y1, x2, y2);graphics.drawLine(x2, y2, x3, y3);

运行效果如图:

还可以实现一个动态滑块验证码,滑块验证码比前几种都要难、复杂。后期将会出一期滑块验证码的讲解,敬请关注!

我是码龙,如果我的文章对您有帮助,请点个 👍🏻 支持我一下,谢谢~

​微信公众号:CodeDragons

本文发布于:2024-01-29 16:19:37,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170651638016545.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:验证码   案例   Java
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23