servlet生成验证码

写个验证码玩玩

servlet生成验证码

主要用到3个对对象
BufferedImage 图像buffer
Graphics2D 图片对象
ImageIO 输出图片

private static final int WIDTH = 120;//图片宽度
private static final int HEIGHT = 25;//图片高度
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
createImager(request,response);
}


private void createImager(HttpServletRequest request, HttpServletResponse response) {
BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
setNoCache(response);//页面不缓存
try {
setBackgroup(g);//设置背景颜色
setBorder(g);//设置边框
drawLine(g);//生成干扰线
drawNum(g);//生成随即数,字体旋转
dispose(g);//释放资源
ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

//生成干扰线
private void drawLine(Graphics g) {
for(int i=0;i<4;i++){
g.setColor(new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255)));//干扰线颜色
g.drawLine(0, new Random().nextInt(25), WIDTH,new Random().nextInt(25));//画干扰线
}
}


//生成随机字符
private void drawNum(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
String str []= {"宋","体","的","一","是","在","出","体","就","分","成","国",
"标","表","不","客","内","日","中","得"};
g2d.setFont(new Font("宋体",Font.BOLD,20));//设置字体
Random random = new Random();
g2d.setColor(Color.BLACK);//设置字体颜色
for(int i=0;i<4;i++){//生成4为随机字符
int n = random.nextInt()%30;//字体旋转角度
double d = n*Math.PI/180;//字体旋转弧度
//字体旋转
g2d.rotate(d,i*20+15, 20);//根据当前字符旋转弧度
String num = str[random.nextInt(str.length)];
g2d.drawString(num, i*20+15, 20);
g2d.rotate(-d,i*20+15, 20);//旋转弧度复位
}
}


//页面不缓存
private void setNoCache(HttpServletResponse response) {
response.addHeader("Expires", "-1");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Pragma", "no-cache");
}

//设置边框
private void setBorder(Graphics g) {
g.setColor(Color.GRAY);
g.drawRect(1, 1, WIDTH-2, HEIGHT-2);
}

//释放资源
private void dispose(Graphics g) {
g.dispose();
}

//设置背景颜色
private void setBackgroup(Graphics g) {
g.setColor(Color.GRAY);
g.fillRect(0, 0, WIDTH, HEIGHT);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值