Servlet生成验证码图片

import  java.awt.Color;
import  java.awt.Font;
import  java.awt.Graphics;
import  java.awt.image.BufferedImage;
import  java.io.IOException;
import  java.io.OutputStream;
import  java.io.PrintWriter;
import  java.util.Random;

import  javax.imageio.ImageIO;
import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

import  com.sun.image.codec.jpeg.JPEGCodec;
import  com.sun.image.codec.jpeg.JPEGImageEncoder;

public   class  Image  extends  HttpServlet {
 
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
   
throws  ServletException, IOException {
  response.setContentType(
" image/jpeg " );
  OutputStream out 
=  response.getOutputStream();
  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(getRandColor( 200 250 ));
  g.fillRect(
0 0 , width, height);
  
//  设定字体
  g.setFont( new  Font( " Times New Roman " , Font.PLAIN,  18 ));
  
//  随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
  g.setColor(getRandColor( 180 200 ));
  
for  ( int  i  =   0 ; i  <   155 ; 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  = setRandValue(request);
  
if (sRand != null )
  
for  ( int  i  =   0 ; i  <  sRand.length(); i ++ ) {
   g.setColor(
new  Color( 20   +  random.nextInt( 200 ),  20   +  random
     .nextInt(
200 ),  20   +  random.nextInt( 200 )));
   
//  调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
   g.drawString(sRand.charAt(i)  +   "" 13   *  i  +   6 16 );
  }
  
  JPEGImageEncoder encoder 
=  JPEGCodec.createJPEGEncoder(out);
  encoder.encode(image);
  
//  图象生效
  g.dispose();
  
//  输出图象到页面
  
//  ImageIO.write(image, "JPG", response.getOutputStream());
  out.flush();
  out.close();
 }

 Color getRandColor(
int  fc,  int  bc) { //  给定范围获得随机颜色
  Random random  =   new  Random();
  
if  (fc  >   255 )
   fc 
=   255 ;
  
if  (bc  >   255 )
   bc 
=   255 ;
  
int  r  =  fc  +  random.nextInt(bc  -  fc);
  
int  g  =  fc  +  random.nextInt(bc  -  fc);
  
int  b  =  fc  +  random.nextInt(bc  -  fc);
  
return   new  Color(r, g, b);
 }
 
// 48-57对应0-9;65-90对应A-Z;97-122对应a-z;
 String setRandValue(HttpServletRequest request) {
  Random random 
=   new  Random();
  String sRand 
=   "" ;
  
// 这里是生成验证码的位数
   for  ( int  i  =   0 ; i  <   4 ; i ++ ) {
   
char  c  =   0 ;
   
int  k  =  random.nextInt( 3 );
   
switch  (k) {
   
case   0 :
    c 
=  ( char ) (random.nextInt( 10 +   48 );
    
break ;
   
case   1 :
    c 
=  ( char ) (random.nextInt( 26 +   65 );
    
break ;
   
case   2 :
    c 
=  ( char ) (random.nextInt( 26 +   97 );
   }
   sRand 
+=  c;
  }
  request.getSession().setAttribute(
" rands " , sRand);
  
return  sRand;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值