@WebServlet("/checkServlet")
public class CheckCode extends HttpServlet {
private static final int width = 80;
private static final int height = 30;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获得字节输入流对象
ServletOutputStream sos = resp.getOutputStream();
//设置浏览器不要缓存此图片
resp.setHeader("Pragma", "No-cache");
resp.setHeader("Cache-Control", "no-cache");
resp.setDateHeader("Expires", 0);
//创建内存图片并获得其上下文
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
//获得画笔
Graphics g = image.getGraphics();
//产生验证码
String checkCode = getCheckCode();
//转发为字符数组
char[] rands = checkCode.toCharArray();
//产生图像
drawBackground(g);//这个是产生了背景图片
drawRands(g,rands);//这个是产生了验证码在图片上
//结束绘制过程,完成图像
g.dispose();
//将图片输入到客户端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte[] bytes = bos.toByteArray();
resp.setContentLength(bytes.length);
sos.write(bytes);
//关流
sos.close();
bos.close();
//将验证码放到Session中
req.getSession().setAttribute("checkCode", checkCode);
}
//定义一个方法获得四位数字的验证码
private String getCheckCode() {
String str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int length = str.length();
StringBuilder sb = new StringBuilder();
Random r = new Random();
for (int i = 0; i < 4; i++) {
int index = r.nextInt(length);
char c = str.charAt(index);
sb.append(c);
}
return sb.toString();
}
//定义一个方法设置图片上的验证码位置
private void drawRands(Graphics g,char[] rands) {
g.setColor(Color.red);
g.setFont(new Font("楷体",Font.ITALIC,30));
//在不同高度输入验证码的每一个字符
g.drawString(""+rands[0] ,1,25);
g.drawString(""+rands[1] ,20,24);
g.drawString(""+rands[2] ,40,21);
g.drawString(""+rands[3] ,60,20);
System.out.println(rands);
}
//定义一个方法用来定义背景图片的大小和位置
private void drawBackground(Graphics g) {
//画背景
g.setColor(Color.black);
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);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
版权声明:本文为codingLei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。