验证码action
程序员文章站
2022-03-03 08:33:47
...
public class AuthorizationCode extends BaseAction
{
static final long serialVersionUID = 19881218; // 明明的生日
public void getVoid()
throws IOException
{
response.setContentType("image/jpeg");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width = 60, height = 20;
BufferedImage image =
new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 生成随机类
Random random = new Random();
// 设定背景色
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, width, height);
// 设定字体
g.setFont(new Font("Comic Sans MS", Font.PLAIN, 18));
// 画边框
g.setColor(this.getRndColor());
// g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(this.getRndColor());
for (int i = 0; i < 10; i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随机产生的认证码(4位数字)
String sRand = "";
for (int i = 0; i < 4; i++)
{
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 将认证码显示到图象中
g.setColor(new Color(127, 127, 127));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("AuthorizationCode", sRand);
// 图象生效
g.dispose();
ServletOutputStream responseOutputStream = response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "JPEG", responseOutputStream);
// 以下关闭输入流!
responseOutputStream.flush();
responseOutputStream.close();
}
private Color getRndColor()
{// 给定范围获得随机颜色
return new Color(this.rnd(), this.rnd(), this.rnd());
}
/** 随机生成0-255的数字* */
private int rnd()
{
java.util.Random random = new java.util.Random();
return random.nextInt(255);
}
/** 把除了大小写字母和数字外的字符全过滤掉* */
@SuppressWarnings("unused")
private char filter(int k)
{
if (k < 65)
k = 48 + (k % 10);
if (k > 64 && k < 96)
k = 65 + (k % 26);
if (k > 96)
k = 97 + (k % 26);
return (char)k;
}
/** 取得一个随机字体* */
@SuppressWarnings("unused")
private String getRndFontNames()
{
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] k = ge.getAvailableFontFamilyNames();
java.util.Random r = new java.util.Random();
return k[r.nextInt(k.length)];
}
}