利用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. SuperSocket源码解析之会话生命周期

    一 基本概念 会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消 ...

  2. Introduction to the Build Lifecycle

    Introduction to the Build Lifecycle Table Of Contents Build Lifecycle Basics Setting Up Your Project ...

  3. js获取地址栏url以及获取url参数

    js原生态写法  代码如下 复制代码 function getUrlParam(name) {     var reg = new RegExp("(^|&)"+ name ...

  4. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述

    上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...

  5. JAVA序列化在IO中读写对象的使用

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序列化是为了解决在对对象流进行读写操作时所引发的问题. 序列 ...

  6. spoj 1812 lcsII (后缀自动机)

    spoj 1812 lcsII (后缀自动机) 题意:求多个串的lcs,最多10个串,每个串最长10w 解题思路:后缀自动机.先建好第一个串的sam,然后后面的串拿上去跑(这个过程同前一题).sam上 ...

  7. Sting和StringBuffer的区别

    java.lang.String代表不可变序列: s1 = "hello"; s2 = "world"; s1 = s1 + s2; 内存分配情况是s1有块内存 ...

  8. (step8.2.7)hdu 1517(A Multiplication Game——巴什博弈变形)

    题目大意:输入一个整数n.谁先报的数大于n,谁就输了.(初始值p  == 1 , 后一个人报的数必须在前一个人报的数的基础上乘上(2 ~ 9)之间的任意一个数) 解题思路:巴什博奕的变形 1) 解题思 ...

  9. 中转server

    中转传输概要设计 中转传输的消息架构为模拟MFC的消息架构,请參考我的上一篇文章. 1. 概述 中转server採用事件驱动的方式,与socket结合.其层次例如以下: 在事件驱动层中,将相关消息发送 ...

  10. IOS详解TableView——对话聊天布局的实现

    上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局.这篇讲述如何利用自定义单元格来实现聊天界面的布局. 借助单元格实现聊天布局难度不大,主要要解决的问题有两个: 1.自己和其他人说 ...