SSM 实现登录验证码(附源码)

今天药忘吃喽~ 2021-09-15 13:28 894阅读 0赞

如果想用框架来实现验证码,可以看我的另外一篇博客:

Kaptcha 框架的使用很简单的。新手必备。

https://blog.csdn.net/weidong_y/article/details/81005658

一、效果图

70

二、实现代码

第一步:先建一个 RandomValidateCode.java 作为工具类。把下面的代码直接复制粘贴即可。

  1. package com.utils;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.util.Random;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11. public class RandomValidateCode {
  12. public static final String RANDOMCODEKEY = "randomcode_key";//放到session中的key
  13. private Random random = new Random();
  14. private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串
  15. private int width = 80;//图片宽
  16. private int height = 26;//图片高
  17. private int lineSize = 40;//干扰线数量
  18. private int stringNum = 4;//随机产生字符数量
  19. /**
  20. * 生成随机图片
  21. */
  22. public void getRandcode(HttpServletRequest request,
  23. HttpServletResponse response) {
  24. HttpSession session = request.getSession();
  25. //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
  26. BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
  27. //产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
  28. Graphics g = image.getGraphics();
  29. g.fillRect(0, 0, width, height);
  30. g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
  31. g.setColor(getRandColor(160, 200));
  32. //绘制干扰线
  33. for(int i=0;i<=lineSize;i++){
  34. drowLine(g);
  35. }
  36. //绘制随机字符
  37. String randomString = "";
  38. for(int i=1;i<=stringNum;i++){
  39. randomString=drowString(g,randomString,i);
  40. }
  41. session.removeAttribute(RANDOMCODEKEY);
  42. session.setAttribute(RANDOMCODEKEY, randomString);
  43. g.dispose();
  44. try {
  45. //将内存中的图片通过流动形式输出到客户端
  46. ImageIO.write(image, "JPEG", response.getOutputStream());
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. /*
  52. * 获得字体
  53. */
  54. private Font getFont(){
  55. return new Font("Fixedsys",Font.CENTER_BASELINE,18);
  56. }
  57. /*
  58. * 获得颜色
  59. */
  60. private Color getRandColor(int fc,int bc){
  61. if(fc > 255)
  62. fc = 255;
  63. if(bc > 255)
  64. bc = 255;
  65. int r = fc + random.nextInt(bc-fc-16);
  66. int g = fc + random.nextInt(bc-fc-14);
  67. int b = fc + random.nextInt(bc-fc-18);
  68. return new Color(r,g,b);
  69. }
  70. /*
  71. * 绘制字符串
  72. */
  73. private String drowString(Graphics g,String randomString,int i){
  74. g.setFont(getFont());
  75. g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
  76. String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));
  77. randomString +=rand;
  78. g.translate(random.nextInt(3), random.nextInt(3));
  79. g.drawString(rand, 13*i, 16);
  80. return randomString;
  81. }
  82. /*
  83. * 绘制干扰线
  84. */
  85. private void drowLine(Graphics g){
  86. int x = random.nextInt(width);
  87. int y = random.nextInt(height);
  88. int xl = random.nextInt(13);
  89. int yl = random.nextInt(15);
  90. g.drawLine(x, y, x+xl, y+yl);
  91. }
  92. /*
  93. * 获取随机的字符
  94. */
  95. public String getRandomString(int num){
  96. return String.valueOf(randString.charAt(num));
  97. }
  98. }

第二步:在 Controller 类写前端 UI 的接口

  1. /**
  2. * 获取生成验证码显示到 UI 界面
  3. * @param request
  4. * @param response
  5. * @throws ServletException
  6. * @throws IOException
  7. */
  8. @RequestMapping(value="/checkCode")
  9. public void checkCode(HttpServletRequest request, HttpServletResponse response)
  10. throws ServletException, IOException {
  11. //设置相应类型,告诉浏览器输出的内容为图片
  12. response.setContentType("image/jpeg");
  13. //设置响应头信息,告诉浏览器不要缓存此内容
  14. response.setHeader("pragma", "no-cache");
  15. response.setHeader("Cache-Control", "no-cache");
  16. response.setDateHeader("Expire", 0);
  17. RandomValidateCode randomValidateCode = new RandomValidateCode();
  18. try {
  19. randomValidateCode.getRandcode(request, response);//输出图片方法
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }

第三步:jsp 页面获取验证码

  1. <img src="checkCode" alt="" width="100" height="32" class="passcode" style="height:43px;cursor:pointer;" onclick="this.src=this.src+'?'">

第四步:我的是在 SSM 环境下实现的,如果不是的话可以自己改写下。

发表评论

表情:
评论列表 (有 0 条评论,894人围观)

还没有评论,来说两句吧...

相关阅读

    相关 登录验证

    验证码的作用是区分人与机器,防止机器刷数据; 验证码的验证分了两步,一步是请求获取验证码,一步是前台传的验证码与后台的验证码进行对比判断后进行后续操作; 在MyEclips

    相关 登录验证实现

    前言: 验证码,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的