<img border="0"
                            src="ValidateCode"
                            id='code' width="64" height="30" 
                            style="vertical-align: top; cursor: pointer;"
                             title="点击刷新验证码" />

JAVA代码:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class ValidateCode extends HttpServlet {      private static final long serialVersionUID = 1L;
     
     private Random rand=new Random();
     
     
     /**
      * 生成随机颜色
      * 
      * @param   start  [int]
      * @param   end    [int]
      * @return  Color  [object]
      */
     public Color getRandColor(int start,int end){
      int randNum;
      if(start>255) start=255;
      if(end>255) end=255;
      if(start>end) randNum=start-end;
      else randNum=end-start;
      int r=start+rand.nextInt(randNum); 
      int g=start+rand.nextInt(randNum);
      int b=start+rand.nextInt(randNum);
      return new Color(r,g,b);
     }
     
     /**
      * 着色\旋转\缩放
      * 
      * @param word 文字
      * @param g    图片对象
      */
     public void coloredAndRotation(String word,int i,Graphics g){
      /**着色**/
      g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
      /**旋转**/
      Graphics2D g2d=(Graphics2D)g;
      AffineTransform trans=new AffineTransform();
      trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
      /**缩放**/
      float scaleSize=rand.nextFloat()+0.8f;
      if(scaleSize>1f) scaleSize=1f;
      trans.scale(scaleSize, scaleSize);
      g2d.setTransform(trans);
      g.drawString(word,15*i+20,20);
     }
     
     /**
      * 生成100条干扰线
      * 
      * @param g2d
      * @param width
      * @param height
      */
     public void getRandLine(Graphics2D g2d,int width,int height){
      for(int i=0;i<100;i++){
       int x=rand.nextInt(width-1);
       int y=rand.nextInt(height-1);
       int z=rand.nextInt(6)+1;
       int w=rand.nextInt(12)+1;
       
       BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
       Line2D line=new Line2D.Double(x,y,x+z,y+w);
       g2d.setStroke(bs);
       g2d.draw(line);
      }
     }
     
     /**
      * 获取随机文字
      * @param  length [int]        验证码长度
      * @param  g      [Graphics]   图片对象
      * @return String
      * @case1:A-Z
      * @case2:chinese
      * @default:0-9
      */
     @SuppressWarnings("unused")
     public String getRandWord(int length,Graphics g){
      String finalWord="",firstWord="";
      int tempInt=0;
      String[] array={
        "0","1","2","3",
        "4","5","6","7",
        "8","9","a","b",
        "c","d","e","f"};
      
      for(int i=0;i<length;i++){
       switch(rand.nextInt(2)){
       //英文数字混合
       /* case 1:
          tempInt=rand.nextInt(26)+65;
          firstWord=String.valueOf((char)tempInt);
          break;*/
       //纯数字
        case 2:
          int r1,r2,r3,r4;
          String strH,strL;//high&low
          r1=rand.nextInt(3)+11; //前闭后开[11,14)
          if(r1==13){
           r2=rand.nextInt(7);
          }else{
           r2=rand.nextInt(16);
          }
          
          r3=rand.nextInt(6)+10;
          if(r3==10){
           r4=rand.nextInt(15)+1;
          }else if(r3==15){
           r4=rand.nextInt(15);
          }else{
           r4=rand.nextInt(16);
          }
          
          strH=array[r1]+array[r2];
          strL=array[r3]+array[r4];
          
          byte[] bytes=new byte[2];
          bytes[0]=(byte)(Integer.parseInt(strH,16));
          bytes[1]=(byte)(Integer.parseInt(strL,16));
          
          firstWord=new String(bytes);
          break;
        default:
          tempInt=rand.nextInt(10)+48;
          firstWord=String.valueOf((char)tempInt);
          break;
       }
       finalWord+=firstWord;
       this.coloredAndRotation(firstWord,i, g);
      }
      
      return finalWord;
     }      protected void service(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
      
      //设制不缓存图片
      response.setHeader("Pragma","No-cache");
      response.setHeader("Cache-Control","No-cache");
      response.setDateHeader("Expires",0);
      
      //生成图片
      response.setContentType("image/jpeg");
      int width=80;
      int height=30;
      BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
      
      Graphics g=image.getGraphics();
      Graphics2D g2d=(Graphics2D)g;
      Font mFont=new Font("宋体",Font.BOLD,22);
      g.setColor(this.getRandColor(200,250));
      g.fillRect(0, 0, width, height);
      g.setFont(mFont);
      g.setColor(this.getRandColor(180,200));
      
      this.getRandLine(g2d, width, height);
      
      String randCode=this.getRandWord(4, g);
      
      HttpSession session=request.getSession();
      session.setAttribute("randCode",randCode);
      
      g.dispose();
      
      ImageIO.write(image,"JPEG",response.getOutputStream());
      
     }
}

JAVA生成验证码的更多相关文章

  1. 【开发技术】Java生成验证码

    Java生成验证码 为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下; ...

  2. Java生成验证码原理(jsp)

     验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...

  3. Java生成验证码(二)

    前一篇博客已经介绍了如何用Java servlet产生验证码,本篇继续介绍如何使用一些开源组件生成验证码 ————————————————————————————————————————————   ...

  4. Java生成验证码并进行验证(转)

    本文转自http://blog.csdn.net/worm0527/article/details/51030864 一.实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用 ...

  5. Java生成验证码_转

    为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下;这是一个web工程, ...

  6. java生成验证码结合springMVC

    在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...

  7. java生成验证码并可刷新

    手心创建一个简单的页面来显示所创建的验证码 <body> <form action="loginName.mvc" method="post" ...

  8. Java 生成验证码图片

    生成验证码图片并对提交的输入进行验证 // HttpServletResponse常见应用——生成验证码 // 利用BufferedImage类生产随机图片 public static final i ...

  9. JAVA生成验证码代码

    生成base64格式图片验证码 /** * 验证码的候选内容 */ private char codeSequence[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', ...

  10. Java生成验证码小工具

    无意中看到一个生成简易验证码的小工具类(保存学习): 工具类代码: import java.awt.BasicStroke; import java.awt.Color; import java.aw ...

随机推荐

  1. java中queue的使用

    Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...

  2. Java锁之自旋锁详解

    锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类 ...

  3. C语言指针总结

    C语言中的精华是什么,答曰指针,这也是C语言中唯一的难点. C是对底层操作非常方便的语言,而底层操作中用到最多的就是指针,以后从事嵌入式开发的朋友们,指针将陪伴我们终身. 本文将从八个常见的方面来透视 ...

  4. 安装tar.bz2文件

    (1) 解包 – tar jxvf softname-10.0.1.tar.gz -C /usr/src/(-C指的是把文件解压到后面的路径下,此处可以不选) – cd /usr/src/softna ...

  5. JsRender语法

    {{:#data.Name}} 或 {{:Name}} 直接显示html格式{{>#data.Name}} 或 {{>Name}} 转义显示html字符 if else {{if bool ...

  6. 安装memcached服务器和PHP中添加memcache拓展模块

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提拱动态 数据驱动网站的速度. memcached ...

  7. mysql 数据库获取当前时间

    mysql> select now(); +---------------------+ | now() | +---------------------+ | 2016-05-27 17:34 ...

  8. JAVA基础学习之throws和throw的区别、Java中的四种权限、多线程的使用等(2)

    1.throws和throw的区别 throws使用在函数外,是编译时的异常,throw使用在函数内,是运行时的异常 使用方法 public int method(int[] arr) throws ...

  9. HTML 调用iscroll.js主要事项

    iscroll是一款很不错的滚动控件(js),但是在调用的时候,需要注意一些事项: 1.iscroll支持水平和垂直滚动,那么在调用的时候,一定注意滚动div必须大于父div,也就是说,父div的宽度 ...

  10. SQLite使用方法 SQLiteOpenHelper操作(转)

    SQLiteOpenHelper主要用于 创建数据库 SQLiteDatabase 主要用于 执行sql语句 程序内使用SQLite数据库是通过SQLiteOpenHelper进行操作 1.      ...