图片验证码

package com.stone.study.validate;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ImgValidateServlet2 extends HttpServlet {
private static int WIDTH = 90;
private static int HEIGHT = 20;
private static int LENGTH = 6;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();

//设置浏览器不要缓存此图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

//创建内存图象并获得其图形上下文
BufferedImage image =
new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

//产生随机的认证码
char [] rands = generateCheckCode();

//产生图像
drawBackground(g);

drawRands(g,rands);

//结束图像的绘制过程,完成图像
g.dispose();

//将图像输出到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, "JPEG", bos);

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

//下面的语句也可写成:bos.writeTo(sos);
sos.write(buf);
bos.close();
sos.close();

//将当前验证码存入到Session或者数据库中,下一个表单处理中验证客户端提交的验证码是否正确
session.setAttribute("check_code",new String(rands));
}

private static char [] generateCheckCode()
{
//定义验证码的字符表
String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char [] rands = new char[LENGTH];
for(int i=0; i<LENGTH; i++)

{
int rand = (int)(Math.random() * 36);
rands[i] = chars.charAt(rand);
}

return rands;
}

private void drawRands(Graphics g , char [] rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

//在不同的高度上输出验证码的每个字符
g.drawString("" + rands[0],1,17);
g.drawString("" + rands[1],16,15);
g.drawString("" + rands[2],31,18);
g.drawString("" + rands[3],46,16);
g.drawString("" + rands[4],61,14);
g.drawString("" + rands[5],76,19);

System.out.println(rands);
}

private void drawBackground(Graphics g)

{
//画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);

//随机产生120个干扰点
for(int i=0; i<120; i++)

{
int x = (int)(Math.random() * WIDTH);

int y = (int)(Math.random() * HEIGHT);

int red = (int)(Math.random() * 255);

int green = (int)(Math.random() * 255);

int blue = (int)(Math.random() * 255);

g.setColor(new Color(red,green,blue));

g.drawOval(x,y,1,0);

}

//加两条干扰线
g.drawLine(0, 5, 90, 5);
g.drawLine(0, 15, 90, 15);

}

public static void main(String args[]) {
char[] chars = generateCheckCode();

System.out.println(chars);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值