利用Ajax实现无刷新的彩色验证码时,也需要编写一个名称为PictureCheckCode.java的Servlet,该类继承HttpServlet,主要通过service()方法生成验证码。

下面将介绍在service()方法中生成彩色验证码的具体过程。

(1)设置响应头信息并指定生成的响应是JPG图片,具体代码

//禁止缓存

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "No-cache");

response.setDateHeader("Expires", 0);

// 指定生成的响应是图片

response.setContentType("image/jpeg");

(2)创建用于生成验证码的绘图类对象,并绘制一个填色矩形作为验证码的背景,具体代码如下:

int width = 200;

int height = 60;

//创建BufferedImage类的对象

BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics(); //创建Graphics类的对象

Graphics2D g2d=(Graphics2D)g; //通过Graphics类的对象创建一个Graphics2D类的对象

Random random = new Random(); //实例化一个Random对象

Font mFont = new Font("华文宋体", Font.BOLD, 30); //通过Font构造字体

g.setColor(getRandColor(200, 250)); //改变图形的当前颜色为随机生成的颜色

g.fillRect(0, 0, width , height); //绘制一个填色矩形

(3)绘制一条干扰线(折线),颜色为深灰色,位置随机产生,具体代码如下:

//创建一个供画笔选择线条粗细的对象

BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);

g2d.setStroke(bs); //改变线条的粗细

g.setColor(Color.DARK_GRAY); //设置当前颜色为预定义颜色中的深灰色

int[] xPoints=new int[3];

int[] yPoints=new int[3];

for(int j=0;j<3;j++){

xPoints[j]=random.nextInt(width - 1);

yPoints[j]=random.nextInt(height - 1);

}

g.drawPolyline(xPoints, yPoints,3); //绘制折线

(4)随机生成4个英文和数字混合的验证码文字,并对文件进行随机缩放并旋转,具体代码如下:

//生成并输出随机的验证文字

g.setFont(mFont);

String sRand="";

int itmp=0;

for(int i=0;i<4;i++){

if(random.nextInt(2)==1){

itmp=random.nextInt(26)+65; //生成A~Z的字母

}else{

itmp=random.nextInt(10)+48; //生成0~9的数字

}

char ctmp=(char)itmp;

sRand+=String.valueOf(ctmp);

Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110));

g.setColor(color);

/****随机缩放文字并将文字旋转指定角度**/

//将文字旋转指定角度

Graphics2D g2d_word=(Graphics2D)g;

AffineTransform trans=new AffineTransform();

trans.rotate(random.nextInt(45)*3.14/180,15*i+10,7);

//缩放文字

float scaleSize=random.nextFloat()+0.8f;

if(scaleSize>1.1f) scaleSize=1f;

trans.scale(scaleSize, scaleSize);

g2d_word.setTransform(trans);

/************************/

g.drawString(String.valueOf(ctmp),30*i+40,16); //输出生成的文字

}

(5)将生成的验证码保存到Session中,并输出生成后的验证码图片,具体代码如下:

//将生成的验证码保存到Session中

HttpSession session=request.getSession(true);

session.setAttribute("randCheckCode",sRand);

g.dispose();

ImageIO.write(image,"JPEG",response.getOutputStream());

希望看了对大家有帮助!

编写生成彩色验证码的Servlet的更多相关文章

  1. servlet生成随机验证码

    package com.cgyue; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import jav ...

  2. JSP实例:彩色验证码

    本例使用一个JavaBean,名为Image.java,包com.zempty.bean下; 三个JSP文件,分别为image.jsp.login.jsp.check.jsp.其中login.jsp是 ...

  3. jsp引用servlet生成的验证码代码演示

    此演示代码主要包括以下三部分:1.checkCode.java:用于生成验证码2.checkCodeServler3.check.jsp 验证 下面是checkCode.java的内容: 复制代码代码 ...

  4. C# :GDI+技术生成复杂型彩色验证码(转载)

    该类是生成一个验证码的类,集合了网上大部分的C#关于GDI+的文章进行多次改进,现在已经形成了可在生产环节中使用的验证码. 该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字以及扭曲,调暗,模糊 ...

  5. java生成一次性验证码

    1.编写生成验证码的工具类: import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.aw ...

  6. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  7. iOS 生成本地验证码

    在应用程序注册.登陆或者有关支付确认的界面,经常会用到验证码,验证码有的是通过手机发送获取的,有的是在本地点击获取的,通过手机发送获取的动态验证码可以使用第三方类库实现,本地点击获取的是在本地自己绘制 ...

  8. kaptcha生成java验证码

    kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一个图片.同时将生成的验证码字符串放到 HttpSession中. 1 ...

  9. 【Java】生成图形验证码

    本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...

随机推荐

  1. awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

    ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 ...

  2. windows phone 8的新特性

    <1>硬件的升级WP8在硬件上有了极大的提升,处理器支持双核或多核 理论最大支持64核,分辨率支持800x480.1280x720/768,屏幕支持720p或WXGA:支持存储卡扩展.同时 ...

  3. WPF4字体改善

    原文 WPF4字体改善 WPF4对字体渲染做了很大的改善,增加了TextOptions属性,该属性可以设置TextFormattingMode,TextRenderingMode,TextHintin ...

  4. 【HTML5游戏开发小技巧】RPG情景对话中,令文本逐字输出

    以前用JAVAscript实现过令文本逐字输出的效果,今天我来用html5中的canvas实现一下.canvas里的内容可不像<p>那样好操作,首先,你需要懂得一些html5的API才能操 ...

  5. mysql 安装过程中的错误:my-template.ini could not be processed and written to XXX\my.ini.Error code-1

    安装mysql的过程中,在最后配置mysql时,提示错误:Configuration file tmeplate E:\编程\MySQL\my-template.ini could not be pr ...

  6. Tuxedo入门学习

    中间件介绍: 介于客户机和server之间的夹层,突破了传统的c/s架构,为构建大规模,高性能,分布式c/s应用程序提供了通信,事物,安全,容错等基础服务,屏蔽了底层应用细节,应用程序不必从底层开发, ...

  7. 项目优化经验分享(六)SVN冲突和处理

    上一篇博客我们分享了新增需求的确定思想<站在全局看问题>.今天我们来分享项目开发中SVN冲突的解决经验:SVN冲突和处理! 引言 开发过项目的人都知道,公司开发一个项目都会使用到版本号控制 ...

  8. 总线接口与计算机通信(二)SPI总线

    SPI总线协议及SPI时序图详解  : http://blog.163.com/sunshine_linting/blog/static/44893323201181482335951/ 浅谈SPI总 ...

  9. javascript笔记整理(数组对象)

    1.属性 a.length--设置或返回数组元素的数目 var a=[1,2,3,45,5]; alert(a.length=6) 结果:6 alert(a[5]) 结果:undefined b.co ...

  10. c#实现Javascript的encodeURIComponent()函数

    原文  c#实现Javascript的encodeURIComponent()函数 国内外各搜索引擎,均用JavaScript的encodeURIComponent()函数对搜索关键字进行编码,终于找 ...