jsp页面生成扭曲的验证码

jsp页面生成扭曲的验证码
<% @ page contentType = " image/jpeg "   import = " java.awt.*,java.awt.image.*,java.util.*,com.sun.image.codec.jpeg.JPEGImageEncoder,com.sun.image.codec.jpeg.JPEGCodec,java.text.AttributedString,java.awt.font.TextLayout,java.awt.font.FontRenderContext,java.awt.geom.AffineTransform " %><%! private  Random generator  =   new  Random();
    
private   static   char [] captchars  =   new   char [] {  ' a ' ' b ' ' c ' ' d ' ' e ' ' 2 ' ' 3 ' ' 4 ' ' 5 ' ' 6 ' ' 7 ' ' 8 ' ' g ' ,
            
' f ' ' y ' ' n ' ' m ' ' n ' ' p ' ' w ' ' x ' , ' h ' , ' k ' , ' r ' , ' t ' , ' u ' , ' v '  };

    
/**   
     * 产生随机字体  
     *  
     * 
@return   
     
*/
    
private  Font getFont( int  size) {
        Random random 
=   new  Random();
        Font font[] 
=   new  Font[ 5 ];
        font[
0 =   new  Font( " Ravie " , Font.PLAIN, size);
        font[
1 =   new  Font( " Antique Olive Compact " , Font.PLAIN, size);
        font[
2 =   new  Font( " Forte " , Font.PLAIN, size);
        font[
3 =   new  Font( " Wide Latin " , Font.PLAIN, size);
        font[
4 =   new  Font( " Gill Sans Ultra Bold " , Font.PLAIN, size);
        
return  font[random.nextInt( 5 )];
    }

    
/**   
     * 随机产生定义的颜色  
     *  
     * 
@return   
     
*/
    
private  Color getRandColor() {
        Random random 
=   new  Random();
        
return   new  Color(random.nextInt( 155 ) + 100 ,random.nextInt( 205 ) + 50 ,random.nextInt( 205 ) + 50 ); // 颜色较暗的一组
    }

    
private   void  shear(Graphics g,  int  w1,  int  h1, Color color) {
        shearX(g, w1, h1, color);
        shearY(g, w1, h1, color);
    }

    
private   void  shearX(Graphics g,  int  w1,  int  h1, Color color) {

        
int  period  =  generator.nextInt( 2 );

        
boolean  borderGap  =   true ;
        
int  frames  =   1 ;
        
int  phase  =  generator.nextInt( 2 );

        
for  ( int  i  =   0 ; i  <  h1; i ++ ) {
            
double  d  =  ( double ) (period  >>   1 )
                    
*  Math.sin(( double ) i  /  ( double ) period  +  ( 6.2831853071795862D   *  ( double ) phase)  /  ( double ) frames);
            g.copyArea(
0 , i, w1,  1 , ( int ) d,  0 );
            
if  (borderGap) {
                g.setColor(color);
                g.drawLine((
int ) d, i,  0 , i);
                g.drawLine((
int ) d  +  w1, i, w1, i);
            }
        }

    }

    
private   void  shearY(Graphics g,  int  w1,  int  h1, Color color) {

        
int  period  =  generator.nextInt( 40 +   10 //  50; 

        
boolean  borderGap  =   true ;
        
int  frames  =   2 ;
        
int  phase  =   1 ; // 倾斜为1/2
         for  ( int  i  =   0 ; i  <  w1; i ++ ) {
            
double  d  =  ( double ) (period  >>   1 )
                    
*  Math.sin(( double ) i  /  ( double ) period  +  ( 6.2831853071795862D   *  ( double ) phase)  /  ( double ) frames);
            g.copyArea(i, 
0 1 , h1,  0 , ( int ) d);
            
if  (borderGap) {
                g.setColor(color);
                g.drawLine(i, (
int ) d, i,  0 );
                g.drawLine(i, (
int ) d  +  h1, i, h1);
            }
        }
    }

    
private   void  drawThickLine(Graphics g,  int  x1,  int  y1,  int  x2,  int  y2,  int  thickness, Color c) {

        
//  The thick line is in fact a filled polygon 
        g.setColor(c);
        
int  dX  =  x2  -  x1;
        
int  dY  =  y2  -  y1;
        
//  line length 
         double  lineLength  =  Math.sqrt(dX  *  dX  +  dY  *  dY);

        
double  scale  =  ( double ) (thickness)  /  ( 2   *  lineLength);

        
//  The x and y increments from an endpoint needed to create a 
        
//  rectangle 
         double  ddx  =   - scale  *  ( double ) dY;
        
double  ddy  =  scale  *  ( double ) dX;
        ddx 
+=  (ddx  >   0 ?   0.5  :  - 0.5 ;
        ddy 
+=  (ddy  >   0 ?   0.5  :  - 0.5 ;
        
int  dx  =  ( int ) ddx;
        
int  dy  =  ( int ) ddy;

        
//  Now we can compute the corner points 
         int  xPoints[]  =   new   int [ 4 ];
        
int  yPoints[]  =   new   int [ 4 ];

        xPoints[
0 =  x1  +  dx;
        yPoints[
0 =  y1  +  dy;
        xPoints[
1 =  x1  -  dx;
        yPoints[
1 =  y1  -  dy;
        xPoints[
2 =  x2  -  dx;
        yPoints[
2 =  y2  -  dy;
        xPoints[
3 =  x2  +  dx;
        yPoints[
3 =  y2  +  dy;

        g.fillPolygon(xPoints, yPoints, 
4 );
    }
%><%
    
int  ImageWidth  =   120 ;
    
int  ImageHeight  =   60 ;

    
int  car  =  captchars.length  -   1 ;
    
/**  
     * 产生随机字符串 
     
*/
    String rand 
=   "" ;
    
for  ( int  i  =   0 ; i  <   4 ; i ++ ) {
        rand 
+=  captchars[generator.nextInt(car)  +   1 ];
    }
    
/**  
     * 放放Session 
     
*/
    request.getSession().setAttribute(
" rand " , rand);
    
/**  
     * 得到输出流 
     
*/
    JPEGImageEncoder encoder 
=  JPEGCodec.createJPEGEncoder(response.getOutputStream());

    BufferedImage bi 
=   new  BufferedImage(ImageWidth  +   10 , ImageHeight, BufferedImage.TYPE_BYTE_INDEXED);

    Graphics2D graphics 
=  bi.createGraphics();

    
/**  
     * 设置背景色 
     
*/
    graphics.setColor(Color.white);

    graphics.fillRect(
0 0 , bi.getWidth(), bi.getHeight());

    
// graphics.setColor(Color.black);
    
// AttributedString attstr = new AttributedString(rand);

    
// TextLayout textTl = new TextLayout(rand, new Font("Courier", Font.BOLD, 70), new FontRenderContext(null,
        
//     true, false));
    
// AffineTransform textAt = graphics.getTransform();
    
// graphics.setFont(new Font("Courier", Font.BOLD, 70));
    graphics.setFont(getFont( 45 ));
    graphics.setColor(
this .getRandColor());
    graphics.drawString(rand, 
10 55 );
    
// textTl.draw(graphics, 4, 60); 
     int  w  =  bi.getWidth();
    
int  h  =  bi.getHeight();
    shear(graphics, w, h, Color.white);
    
this .drawThickLine(graphics,  0 , generator.nextInt(ImageHeight)  +   1
     ImageWidth, generator.nextInt(ImageHeight) 
+   1 2 , getRandColor());
    
this .drawThickLine(graphics,  0 , generator.nextInt(ImageHeight)  +   1
             ImageWidth, generator.nextInt(ImageHeight) 
+   1 2 , getRandColor());
     

    
// response.setContentType("image/jpg");

    encoder.encode(bi);
%>

你可能感兴趣的:(jsp页面生成扭曲的验证码)