VerifyCode.java
上传用户:sdtxjx
上传日期:2022-07-09
资源大小:2937k
文件大小:3k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. /***************************************************
  2.  *  
  3.  *  源文件名:  VerifyCode.java
  4.  *  功    能: 梦想年华新闻系统 - 验证码
  5.  * 作者:梦想年华 [DreamTime]
  6.  * Email:fanwsp@126.com
  7.  *  QQ:122142023 
  8.  *  CopyRight(c)2005-2006 by DreamTime 
  9.  *
  10.  ****************************************************
  11. */
  12. package dreamtime.dreamnews; //指定类所在的包
  13. import java.awt.*; //导入类
  14. import java.awt.image.*;
  15. import java.util.*;
  16. import javax.imageio.*;
  17. //定义类
  18. public class VerifyCode {
  19. static Random r = new Random();
  20. static String ssource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  + "abcdefghijklmnopqrstuvwxyz" + "0123456789";
  21. static char[] src = ssource.toCharArray();
  22. //产生随机字符串
  23. private static String randString (int length){
  24. char[] buf = new char[length];
  25. int rnd;
  26. for(int i=0;i<length;i++){
  27. rnd = Math.abs(r.nextInt()) % src.length;
  28. buf[i] = src[rnd];
  29. }
  30. return new String(buf);
  31. }
  32. //调用该方法,产生随机字符串,
  33. //参数i: 为字符串的长度
  34. public String runVerifyCode(int i){
  35. String VerifyCode = randString(i);
  36. return VerifyCode;
  37. }
  38. //给定范围获得随机颜色
  39. public Color getRandColor(int fc,int bc)
  40. {
  41.    Random random = new Random();
  42.    if(fc>255) fc=255;
  43.    if(bc>255) bc=255;
  44.    int r=fc+random.nextInt(bc-fc);
  45.    int g=fc+random.nextInt(bc-fc);
  46.    int b=fc+random.nextInt(bc-fc);
  47.    return new Color(r,g,b);
  48.     }
  49.   
  50.    //调用该方法将得到的验证码生成图象
  51.    //sCode:传递验证码 w:图象宽度 h:图象高度
  52.    public BufferedImage CreateImage(String sCode)
  53.    {
  54.    try{
  55.    //字符的字体
  56. Font CodeFont = new Font("Arial Black",Font.PLAIN,16);
  57. int iLength = sCode.length(); //得到验证码长度
  58. int width=22*iLength, height=20; //图象宽度与高度
  59. int CharWidth = (int)(width-24)/iLength; //字符距左边宽度
  60. int CharHeight = 16;     //字符距上边高度
  61. // 在内存中创建图象
  62. BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  63. // 获取图形上下文
  64. Graphics g = image.getGraphics();
  65. //生成随机类
  66. Random random = new Random();
  67. // 设定背景色
  68. g.setColor(getRandColor(200,240));
  69. g.fillRect(0, 0, width, height);
  70. //设定字体
  71. g.setFont(CodeFont);
  72. //画随机颜色的边框
  73. g.setColor(getRandColor(10,50));
  74. g.drawRect(0,0,width-1,height-1);
  75. // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
  76. g.setColor(getRandColor(160,200));
  77. for (int i=0;i<155;i++)
  78. {
  79.   int x = random.nextInt(width);
  80.   int y = random.nextInt(height);
  81.   int xl = random.nextInt(12);
  82.   int yl = random.nextInt(12);
  83.   g.drawLine(x,y,x+xl,y+yl);
  84. }
  85. for (int i=0;i<iLength;i++)
  86. {
  87. String rand = sCode.substring(i,i+1); 
  88. // 将认证码显示到图象中
  89. g.setColor(new Color(20+random.nextInt(60),20+random.nextInt(120),20+random.nextInt(180)));
  90. g.drawString(rand,CharWidth*i+14,CharHeight);
  91. }
  92. // 图象生效
  93. g.dispose();
  94. return image;
  95. }catch(Exception e){
  96. //e.printStackTrace();
  97. //System.out.println(e.getMessage());
  98. }
  99. return null;
  100. }
  101. //测试
  102. public static void main(String[] args){
  103. //VerifyCode vc = new VerifyCode();
  104. //String s1 = vc.runVerifyCode(4);
  105. //Fun.DreamNewsTitle;System.out.println(s1);
  106. //Image im = vc.CreateImage(s1);
  107. //Graphics g = im.getGraphics();
  108. //g.drawImage(im,20,20,this);
  109. //g.drawString(s1,20,20);
  110. }
  111. }