您的位置:首页 > 编程语言 > Java开发

验证码的实现

2016-04-15 10:02 471 查看
各种网页的登录界面上,登录时都有验证码,常规的验证码就是4位,26个字母及10个阿拉伯数字组成,下面,我就写一个常规验证码的制作

package com.tly.Servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
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 DrawImage extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 绘图
*/
//1.创建一个内存映像(画布)
BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
//2.获得画笔
Graphics g = image.getGraphics();
//3.设置画笔颜色
g.setColor(new Color(255,255,255));
//4.设置画布背景颜色
g.fillRect(0, 0, 80, 30);
//5.生成一个随机数
Random r = new Random();
//String number = r.nextInt(10000) + "";
String number = getNumber(4);
//将随机数绑定到session对象
HttpSession session = request.getSession();
session.setAttribute("number", number);
//6.将随机数绘制到图片上
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.setFont(new Font(null, Font.ITALIC, 24));
g.drawString(number, 4, 25);
//7.加干扰线
for(int i = 0;i < 8;i++){
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(r.nextInt(80), r.nextInt(30), r.nextInt(80), r.nextInt(30));
}
/*
* 压缩图片,然后输出
*/
//1.设置服务器返回的数据类型为图片
response.setContentType("image/jpeg");
//2.获得输出流
OutputStream os = response.getOutputStream();
//3.压缩图片并输出
ImageIO.write(image, "jpeg", os);
os.close();
}

private String getNumber(int size){
String number = "";
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for(int i = 0;i < size;i++){
number += chars.charAt(r.nextInt(chars.length()));
}
return number;
}
}
不足之处,请大家多多指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 验证码