您的位置:首页 > 其它

生成图片验证码的Servlet

2014-08-30 19:59 183 查看
package chat.servlet;

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 java.io.PrintWriter;

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 CheckCodeImage extends HttpServlet {

private static int WIDTH=64;

private static int HEIGHT=20;

/**

* The doGet method of the servlet. <br>

*

* This method is called when a form has its tag value method equals to get.

*

* @param request the request send by the client to the server

* @param response the response send by the server to the client

* @throws ServletException if an error occurred

* @throws IOException if an error occurred

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("image/jpeg");

HttpSession session = request.getSession();

//不设置缓存

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

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

response.setDateHeader("Expires", 0);

ServletOutputStream sos = response.getOutputStream();

//创建内存图像并获取图像上下文

BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();

//产生随机验证码

char[] rands = generateCheckCode();

//绘制图像

drawBackgound(g);

drawRands(g,rands);

//结束绘制

g.dispose();

//将图像输出到客户端

ByteArrayOutputStream bos = new ByteArrayOutputStream();

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

byte[] buf = bos.toByteArray();

response.setContentLength(buf.length);

sos.write(buf);

bos.close();

sos.close();

//将验证码放在session中

session.setAttribute("checkCode", new String(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);

}

private void drawBackgound(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, 1);

}

}

private char[] generateCheckCode() {

String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

char[] rands = new char[4];

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

int rand = (int) (Math.random()*36);

rands[i] = chars.charAt(rand);

}

return rands;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  验证码 servlet