package com.authority.ui.web.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.util.Random;
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;
@SuppressWarnings("serial")
public class CheckCodeServlet extends HttpServlet
{
private static int WIDTH = 60;
private static int HEIGHT = 20;
private String CheckCode_Session = "CheckCode";
/**
* HttpServlet方法实现,验证码图片升成逻辑
* 1.设置浏览器不要缓存此图片
* 2.创建内存图象并获得其图形上下文
* 3.产生随机的认证码
* 4.产生图像
* 5.结束图像的绘制过程,完成图像
* 6.将图像输出到客户端
* 7.将当前验证码存入到Session
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
HttpSession session = request.getSession();
//设置浏览器不要缓存此图片
response.setContentType("image/jpeg");
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();
//产生图像
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(CheckCode_Session, new String(rands));
//直接使用下面的代码将有问题,Session对象必须在提交响应前获得
//request.getSession().setAttribute("check_code",new String(rands));
}
/**
* 生成验证码
*
* @return
*/
private char[] generateCheckCode()
{
//定义验证码的字符表
//考虑到1和l难以区分,将l大写为L
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;
}
/**
* 生成图片
*
* @param g
* @param rands
*/
private void drawRands(Graphics g, char[] rands)
{
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.PLAIN, 15));
//在不同的高度上输出验证码的每个字符
//1,10,20,30 左右位置,15高度
g.drawString("" + rands[0], 3, 13);
g.drawString("" + rands[1], 16, 13);
g.drawString("" + rands[2], 29, 13);
g.drawString("" + rands[3], 42, 13);
//System.out.println(rands);
}
/**
* 画干扰背景
*
* @param g
*/
private void drawBackground(Graphics g)
{
Random r = new Random();
//画背景
g.setColor(new Color(0xffffff));
g.fillRect(0, 0, WIDTH, HEIGHT);
//随机干扰点
for (int x = 0; x < WIDTH; x++)
{
for (int y = 0; y < HEIGHT; y++)
{
int t = r.nextInt(3);
if (t == 0)
{
//蓝绿
g.setColor(new Color(200, 248, 248));
g.drawOval(x, y, 1, 0);
}
if (t == 1)
{
//白
g.setColor(new Color(255, 255, 255));
g.drawOval(x, y, 1, 0);
}
if (t == 2)
{
//淡紫
g.setColor(new Color(200, 200, 248));
g.drawOval(x, y, 1, 0);
}
}
}
// 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);
// }
}
/**
* public void CreateImage(string Code)
{
System.Drawing.Text.PrivateFontCollection pfc = new System.Drawing.Text.PrivateFontCollection();
pfc.AddFontFile( HttpContext.Current.Server.MapPath( "~/File/Font/arial.ttf")); //添加字体的集合
int iwidth = (int)(Code.Length * 15);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 24);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font(pfc.Families[0], 15,FontStyle.Bold, GraphicsUnit.Pixel);//创建font
Brush b = new System.Drawing.SolidBrush(Color.White);
g.Clear(Color.Blue);
//画字
g.DrawString(Code, f, b, 3, 3);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
* */
}
分享到:
相关推荐
水煮随机码生成器可输入想要生成随机码的位数,批量生成随机码的个数,是一款实用的随机码生成工具。 水煮随机码生成器功能 1、自定义输入想要批量生成随机码的位数、个数; 2、支持大/小写字母、数字及符号常规...
32随机码生成工具
简易6位随机密码生成器,可以自动生成6位字母的随机密码
随机密码生成器
随机码生成软件是一种在信息技术领域广泛应用的工具,主要用于创建不可预测的、无规律的数据序列,这些数据序列通常用于密码学、安全验证、软件激活码、抽奖系统等方面。在这篇文章中,我们将深入探讨随机码生成软件...
随风随机密码生成器是一个简单的随机密码生成工具。 随风随机密码生成器使用说明: 1.密码可以是“数字,字母,符号”任意组合 2.可生成5到100位密码!满足大多应用!可以选加Id! 3.可一次生成999万个密码!生成...
数字和字母(大写、小写)、混合特殊字符等多种组合,自定义输出的长度和批量生成数量可任意组合需要的字符进行随机密码字符生成,可以作为随机密码密钥生成器用于项目测试使用,也可以自行决定使用用途
绿色小软件,绝对无毒,16位随机密码生成器
这是一些java随机密码生成的源码,对于初学开发者有一定的帮助、
在IT领域,随机码生成器是一种非常实用的工具,它能根据用户的需求生成特定类型和长度的随机字符串。这些字符串可以用于多种用途,比如密码安全、数据加密、测试用例生成、唯一标识符分配等。下面我们将深入探讨随机...
该代码可以生成一个大写字母+2个小写字母+6个数字+3个特殊字符的随机密码。Windows下运行参考:https://blog.csdn.net/u011177600/article/details/79520285
黑营随机码生成器可输入想要生成随机码的位数,批量生成随机码的个数,是一款实用的随机码生成工具。 1.自定义输入想要生成随机码的位数; 2.批量生成随机码的个数; 3.支持大/小写字母、数字及符号常规组合选项; 4....
用vb编写的随机密码生成器,可以免去填写密码时费脑子考虑,不过生成的密码要自己记好。密码的位数可以自己选择,也可以选择密码中包含的内容,数字、大写字母、小写字母以及其它字符都可以选,也可以组合使用。
用C++编写的随机密码生成工具软件,简单易懂
随风随机密码生成器Ver1.0 闲暇时,做了个随机密码生成工具,欢迎使用! 以下是简单说明: 1.密码可以是“数字,字母,符号”任意组合! 2.可生成5到100位密码!满足大多应用!可以选加Id! 3.可一次生成999万...
随机密码生成通常涉及加密学原理,可能包括使用伪随机数生成器(PRNG)或者强随机数源。在C++中,可以使用库来生成随机数。生成的密码可能基于特定的长度、字符集(如大小写字母、数字、特殊字符等)和复杂性规则。 ...
水煮随机码生成器是一款简单好用的随机码生成工具。软件不仅操作方便,而且界面美观简洁、简单全面、实用方便,可快速上手,用户只需输入想要生成随机码的位数,批量生成随机码的个数,即可快速批量生成,轻轻松松...
JavaScript(简称JS)是一种轻量级的解释型编程语言,广泛应用于网页和网络应用开发,包括动态内容、用户交互、数据处理以及创建各种实用工具,如我们这里的随机密码生成器。这个"JS随机密码生成器.rar"是一个压缩包...