当前位置:   article > 正文

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

java 验证码登录

简介

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

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

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

链接:https://pan.baidu.com/s/17USG0Kxm1uvxAXy7yP7sPw 
提取码:pncz

功能预览:

Java实现验证码功能

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

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

  1. public class yanzhengma extends JFrame {
  2. private JTextField nameText;// 用户名输入框
  3. private JPasswordField pwdText;// 密码输入框
  4. private JTextField codeText;// 验证码输入框
  5. private JButton button_1;// 登陆按钮
  6. public yanzhengma() {
  7. super();
  8. setResizable(false);
  9. setTitle("Java实现验证码功能");
  10. setBounds(700, 450, 400, 200);
  11. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12. JPanel panel = new JPanel();
  13. panel.setLayout(null);
  14. getContentPane().add(panel, BorderLayout.CENTER);
  15. JLabel label_1 = new JLabel();
  16. label_1.setText("用户名:");
  17. label_1.setBounds(10, 10, 50, 20);
  18. panel.add(label_1);
  19. nameText = new JTextField();
  20. nameText.setBounds(60, 10, 300, 20);
  21. panel.add(nameText);
  22. JLabel label_2 = new JLabel();
  23. label_2.setText("密 码:");
  24. label_2.setBounds(10, 35, 50, 20);
  25. panel.add(label_2);
  26. pwdText = new JPasswordField();
  27. pwdText.setBounds(60, 35, 300, 20);
  28. panel.add(pwdText);
  29. JLabel label_3 = new JLabel();
  30. label_3.setText("验证码:");
  31. label_3.setBounds(10, 75, 50, 20);
  32. panel.add(label_3);
  33. codeText = new JTextField();
  34. codeText.setBounds(60, 70, 80, 30);
  35. panel.add(codeText);
  36. button_1 = new JButton("登陆");
  37. button_1.setBounds(30, 110, 80, 20);
  38. panel.add(button_1);
  39. button_1.addActionListener(new ActionListener() {
  40. @Override
  41. public void actionPerformed(ActionEvent e) {
  42. String username = nameText.getText();// 从文本框中获取用户名
  43. String password = new String(pwdText.getPassword());// 从密码框中获取密码
  44. String code = codeText.getText().toUpperCase();// 获得输入的验证码,并转换为大写字母
  45. String info = "";// 提示信息
  46. // 判断用户名是否为null或空的字符串
  47. if (username == null || username.isEmpty()) {
  48. info = "用户名为空!";
  49. }
  50. // 判断密码是否为null或空的字符串
  51. else if (password == null || password.isEmpty()) {
  52. info = "密码为空!";
  53. }
  54. // 判断验证码是否为null或空的字符串
  55. else if (code == null || code.isEmpty()) {
  56. info = "验证码为空!";
  57. }
  58. // 如果用户名与密码均为"123456",则登录成功
  59. else if (username.equals("123456") && password.equals("123456")) {
  60. info = "登录成功!";
  61. } else {
  62. info = "用户名或密码错误!";
  63. }
  64. JOptionPane.showMessageDialog(null, info);// 通过对话框弹出用户登录信息
  65. }
  66. });
  67. JButton button_2 = new JButton("重置");
  68. button_2.setBounds(130, 110, 80, 20);
  69. panel.add(button_2);
  70. button_2.addActionListener(new ActionListener() {
  71. @Override
  72. public void actionPerformed(ActionEvent e) {
  73. nameText.setText("");// 清空用户名文本框
  74. pwdText.setText("");// 清空密码框
  75. codeText.setText("");// 清空验证码框
  76. }
  77. });
  78. JButton button_3 = new JButton("看不清");
  79. button_3.setBounds(230, 110, 80, 20);
  80. panel.add(button_3);
  81. button_3.addActionListener(new ActionListener() {
  82. @Override
  83. public void actionPerformed(ActionEvent e) {
  84. //待补充的代码
  85. }
  86. });
  87. }
  88. public static void main(String[] args) {
  89. yanzhengma frame = new yanzhengma();
  90. frame.setVisible(true);// 窗体
  91. }
  92. }

运行效果如图:

2.创建验证码面板类

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

  1. class CodePanel extends JPanel {
  2. Random random = new Random();// 随机数实例化
  3. private String code = "";// 验证码
  4. public CodePanel() {
  5. this.setVisible(true);
  6. setLayout(null);
  7. }
  8. public void paint(Graphics g) {
  9. String wenzi = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 验证码的字母
  10. BufferedImage image = new BufferedImage(120, 35, BufferedImage.TYPE_INT_BGR);
  11. Graphics graphics = image.getGraphics();
  12. if (!code.isEmpty()) {
  13. code = "";
  14. }
  15. graphics.setFont(new Font("楷体", Font.BOLD, 20));
  16. graphics.fillRect(0, 0, 120, 35);
  17. for (int i = 0; i < 4; i++) {//生成四个待验证的文字
  18. int index = random.nextInt(wenzi.length());
  19. String s = wenzi.substring(index, index + 1);// 截取字段
  20. code += s;// 验证码新增截取字段
  21. graphics.setColor(Color.green);
  22. Graphics2D g2d = (Graphics2D) graphics;
  23. AffineTransform transform = new AffineTransform();
  24. transform.rotate(random.nextInt(45) * 3.14 / 180, 22 * i + 8, 7);// 随机转动
  25. float scaleSize = random.nextFloat() + 0.8f;// 缩放文字
  26. if (scaleSize > 1f)
  27. scaleSize = 1f;// 如果scaleSize大于1,则等于1
  28. transform.scale(scaleSize, scaleSize); // 进行缩放
  29. g2d.setTransform(transform);// 设置AffineTransform对象
  30. graphics.drawString(s, 120 / 6 * i + 28, 35 / 2);// 画出验证码
  31. }
  32. g.drawImage(image, 0, 0, null);
  33. }
  34. public void draw() {
  35. repaint();// 重新绘制验证码
  36. }
  37. public String getNum() {
  38. return code;// 返回验证码
  39. }
  40. }

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

  1. public class yanzhengma extends JFrame {
  2. // 用户名输入框
  3. // 密码输入框
  4. // 验证码输入框
  5. // 登陆按钮
  6. private CodePanel codePanel = null;
  7. private int num = 0;// 计数器
  8. public yanzhengma() {
  9. //此处省略不作改变代码
  10. codePanel = new CodePanel();
  11. codePanel.setBounds(150, 67, 100, 35);
  12. getContentPane().add(codePanel);
  13. //此处省略不作改变代码
  14. // 如果用户名与密码均为"123456",则登录成功
  15. else if (username.equals("123456") && password.equals("123456")) {
  16. info = "登录成功!";
  17. codePanel.draw();// 更新验证码
  18. } else {
  19. info = "用户名或密码错误!";
  20. num++;
  21. if (num == 3) {
  22. button_1.setEnabled(false);
  23. // 设置计时任务 1s 循环5次 停止任务
  24. Timer timer = new Timer();
  25. timer.schedule(new TimerTask() {
  26. int i = 5;
  27. @Override
  28. public void run() {
  29. i--;
  30. button_1.setText(i + "秒");
  31. if (i <= 0) {
  32. button_1.setEnabled(true);// 设置按钮可点击 并且停止任务
  33. button_1.setText("登陆");
  34. codePanel.draw();// 更新验证码
  35. timer.cancel();
  36. }
  37. }
  38. }, 0, 1000);
  39. }
  40. }
  41. JOptionPane.showMessageDialog(null, info);// 通过对话框弹出用户登录信息
  42. }
  43. });
  44. //此处省略不作改变代码
  45. JButton button_3 = new JButton("看不清");
  46. button_3.setBounds(230, 110, 80, 20);
  47. panel.add(button_3);
  48. button_3.addActionListener(new ActionListener() {
  49. @Override
  50. public void actionPerformed(ActionEvent e) {
  51. if (codePanel != null) {
  52. codePanel.draw();// 更新验证码
  53. }
  54. }
  55. });
  56. }
  57. public static void main(String[] args) {
  58. //此处省略不作改变代码
  59. }
  60. }

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

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

  1. public void paint(Graphics g) {
  2. //此处省略不作改变代码
  3. Image bgImage=null;
  4. try {
  5. bgImage= ImageIO.read(new File("src/image.jpg"));
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }
  9. image.getGraphics().drawImage(bgImage,0,0,120,35,null);
  10. for (int i = 0; i < 4; i++) {//生成四个待验证的文字
  11. //此处省略不作改变代码
  12. }

运行效果如图:

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

  1. int x1 = random.nextInt(20);// 第一条线起始X坐标
  2. int x2 = random.nextInt(30) + 35;// 第二条线起始X坐标,第一条线的终止X坐标
  3. int x3 = random.nextInt(30) + 90;// 第二条线的终止X坐标
  4. int y1 = random.nextInt(20);// 第一条线的Y坐标
  5. int y2 = random.nextInt(10) + 20;// 第二条线起始Y坐标,第一条线的终止Y坐标
  6. int y3 = random.nextInt(10) + 5;// 第二条线的终止Y坐标
  7. graphics.setColor(Color.black);
  8. graphics.drawLine(x1, y1, x2, y2);
  9. graphics.drawLine(x2, y2, x3, y3);

运行效果如图:

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

图片

我是码龙,如果我的文章对您有帮助,请点个 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/127477
推荐阅读
相关标签