两组验证码小例子

validateCode.jsp:

<% @ page language = " java "  import = " java.util.* "  pageEncoding = " UTF-8 " %>
<%
String  path  =  request.getContextPath();
String  basePath  =  request.getScheme() + " :// " + request.getServerName() + " : " + request.getServerPort() + path + " / " ;
%>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
  
< head >
    
< base  href ="<%=basePath%>" >
    
< title > 两组验证码 </ title >
    
< meta  http-equiv ="pragma"  content ="no-cache" >
    
< meta  http-equiv ="cache-control"  content ="no-cache" >
    
< meta  http-equiv ="expires"  content ="0" >     
    
< meta  http-equiv ="keywords"  content ="keyword1,keyword2,keyword3" >
    
< meta  http-equiv ="description"  content ="This is my page" >
  
</ head >
  
  
< body >
    Two Validate Code: 
< br >
    
< img  src ="vc_1.jsp"   />
    
< img  src ="vc_2.jsp"   />
  
</ body >
</ html >


vc_1.jsp:

<% @ page language = " java "  import = " java.util.* "  pageEncoding = " UTF-8 " %>
<% @ page import = " com.ysx.system.actions.* " %>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
    
< head >
        
< title > 验证码测试 </ title >
    
</ head >

    
< body >
        
< form  name ="f1"  method ="post"  action ="login.jsp" >
            
< div >
                
<%
                    Yzm a 
=   new  Yzm();
                    a.service(request, response);
                    out.clear();
                    out 
=  pageContext.pushBody();
                
%>
            
</ div >
        
</ form >
    
</ body >
</ html >

vc_2.jsp:

<% @ page
    import
= " java.awt.*,java.awt.image.*,java.util.*,javax.imageio.* " %>
<% @ page import = " java.io.OutputStream " %>
<% !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);
    }
%>
<%
    try {
        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);
        OutputStream os 
=  response.getOutputStream();
        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 ));
        g.setColor(getRandColor(
160 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);
        }
        
String  sRand  =   "" ;
        
for  ( int  i  =   0 ; i  <   4 ; i ++ ) {
            
String  rand  =   String .valueOf(random.nextInt( 10 ));
            sRand 
+=  rand;
            g.setColor(
new  Color( 20   +  random.nextInt( 110 ),  20   +  random
                    .nextInt(
110 ),  20   +  random.nextInt( 110 )));
            g.drawString(rand, 
13   *  i  +   6 16 );
        }
        session.setAttribute(
" rand " , sRand);
        g.dispose();

        ImageIO.write(image, 
" JPEG " , os);
        os.flush();
        os.close();
        os 
=   null ;
        response.flushBuffer();
        out.clear();
        out 
=  pageContext.pushBody();
    } catch (IllegalStateException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
%>

Yzm.java:

import  java.awt.Color;
import  java.awt.Font;
import  java.awt.Graphics2D;
import  java.awt.image.BufferedImage;
import  java.util.Random;
import  javax.imageio.ImageIO;

import  javax.servlet. * ;
import  javax.servlet.http. * ;

public   class  Yzm  extends  HttpServlet  {
    
    
public static final long serialVersionUID = 1L;
    
    
// 验证码图片的宽度。
    private int width = 60;
    
// 验证码图片的高度。
    private int height = 20;

    
protected void service(HttpServletRequest req, HttpServletResponse resp)
            
throws ServletException, java.io.IOException {
        BufferedImage buffImg 
= new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g 
= buffImg.createGraphics();

        
// 创建一个随机数生成器类。
        Random random = new Random();
        g.setColor(Color.WHITE);
        g.fillRect(
00, width, height);

        
// 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Times New Roman", Font.PLAIN, 18);
        
// 设置字体。
        g.setFont(font);

        
// 画边框。
        g.setColor(Color.BLACK);
        g.drawRect(
00, width - 1, height - 1);

        
// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
        g.setColor(Color.GRAY);
        
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);
        }


        
// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        
int red = 0, green = 0, blue = 0;

        
// 随机产生4位数字的验证码。
        for (int i = 0; i < 4; i++{
            
// 得到随机产生的验证码数字。
            String strRand = String.valueOf(random.nextInt(10));

            
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(200);
            green 
= random.nextInt(200);
            blue 
= random.nextInt(200);

            
// 产生随机高度 13至height之间
            float imght = 0;
            
while (imght <= 12{
                imght 
= Float
                        .parseFloat(String.valueOf(random.nextInt(height)));
            }

            
// 用随机产生的颜色将验证码绘制到图像中。
            g.setColor(new Color(red, green, blue));
            g.drawString(strRand, 
13 * i + 6, imght);

            
// 将产生的四个随机数组合在一起。
            randomCode.append(strRand);
        }

        
// 将四位数字的验证码保存到Session中。
        HttpSession session = req.getSession();
        session.setAttribute(
"randomCode", randomCode.toString());

        
// 禁止图像缓存。
        resp.setHeader("Pragma""no-cache");
        resp.setHeader(
"Cache-Control""no-cache");
        resp.setDateHeader(
"Expires"0);

        resp.setContentType(
"image/jpeg");

        
// 将图像输出到Servlet输出流中。
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(buffImg, 
"jpeg", sos);
        sos.close();
    }

}

 

你可能感兴趣的:(验证码)