java 生成网页图片验证码的工具类

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

挺好用的

发表评论

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

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

相关阅读

    相关 Java生成图片验证

    功能介绍:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,干扰线,噪点,背景扭曲。 VerifyCodeUtils类,生成图片流,然后不同框