[JAVA realizes picture verification code]

JAV A code:

1. Picture tools

import java.awt.Color;  

import java.awt.Font;  

import java.awt.Graphics;  

import java.awt.Graphics2D;  

import java.awt.LinearGradientPaint;  

import java.awt.Paint;  

import java.awt.RenderingHints;  

import java.awt.geom.AffineTransform;  

import java.awt.image.BufferedImage;  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.IOException;  

import java.io.OutputStream;  

import java.util.Arrays;  

import java.util.Random;  

  

import javax.imageio.ImageIO;  

  

public class VerifyCodeUtils{  

  

    //Use the Algerian font. If there is no font in the system, you need to install the font. The font only displays uppercase, and the 1,0,i,o characters that are easy to be confused are removed.  

    public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";  

    private static Random random = new Random();  

  

  

    /** 

     * Use the system default character source to generate verification code 

     * @param verifySize verification code length 

     * @return 

     */  

    public static String generateVerifyCode(int verifySize){  

        return generateVerifyCode(verifySize, VERIFY_CODES);  

    }  

    /** 

     * Generate verification code using specified source 

     * @param verifySize verification code length 

     * @param sources verification code character source 

     * @return 

     */  

    public static String generateVerifyCode(int verifySize, String sources){  

        if(sources == null || sources.length() == 0){  

            sources = VERIFY_CODES;  

        }  

        int codesLen = sources.length();  

        Random rand = new Random(System.currentTimeMillis());  

        StringBuilder verifyCode = new StringBuilder(verifySize);  

        for(int i = 0; i < verifySize; i++){  

            verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));  

        }  

        return verifyCode.toString();  

    }  

      

    /** 

     * Generate a random verification code file and return the verification code value 

     * @param w 

     * @param h 

     * @param outputFile 

     * @param verifySize 

     * @return 

     * @throws IOException 

     */  

    public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException{  

        String verifyCode = generateVerifyCode(verifySize);  

        outputImage(w, h, outputFile, verifyCode);  

        return verifyCode;  

    }  

      

    /** 

     * Output random captcha image stream and return captcha value 

     * @param w 

     * @param h 

     * @param os 

     * @param verifySize 

     * @return 

     * @throws IOException 

     */  

    public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException{  

        String verifyCode = generateVerifyCode(verifySize);  

        outputImage(w, h, os, verifyCode);  

        return verifyCode;  

    }  

      

    /** 

     * Generate the specified verification code image file 

     * @param w 

     * @param h 

     * @param outputFile 

     * @param code 

     * @throws IOException 

     */  

    public static void outputImage(int w, int h, File outputFile, String code) throws IOException{  

        if(outputFile == null){  

            return;  

        }  

        File dir = outputFile.getParentFile();  

        if(!dir.exists()){  

            dir.mkdirs();  

        }  

        try{  

            outputFile.createNewFile();  

            FileOutputStream fos = new FileOutputStream(outputFile);  

            outputImage(w, h, fos, code);  

            fos.close();  

        } catch(IOException e){  

            throw e;  

        }  

    }  

      

    /** 

     * Output the specified verification code image stream 

     * @param w 

     * @param h 

     * @param os 

     * @param code 

     * @throws IOException 

     */  

    public static void outputImage(int w, int h, OutputStream os, String code) throws IOException{  

        int verifySize = code.length();  

        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);  

        Random rand = new Random();  

        Graphics2D g2 = image.createGraphics();  

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);  

        Color[] colors = new Color[5];  

        Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,  

                Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,  

                Color.PINK, Color.YELLOW };  

        float[] fractions = new float[colors.length];  

        for(int i = 0; i < colors.length; i++){  

            colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];  

            fractions[i] = rand.nextFloat();  

        }  

        Arrays.sort(fractions);  

          

        g2.setColor(Color.GRAY);// Set the border color  

        g2.fillRect(0, 0, w, h);  

          

        Color c = getRandColor(200, 250);  

        g2.setColor(c);// Set the background color  

        g2.fillRect(0, 2, w, h-4);  

          

        // draw interference lines  

        Random random = new Random();  

        g2.setColor(getRandColor(160, 200));// Set the color of the line  

        for (int i = 0; i < 20; i++) {  

            int x = random.nextInt(w - 1);  

            int y = random.nextInt(h - 1);  

            int xl = random.nextInt(6) + 1;  

            int yl = random.nextInt(12) + 1;  

            g2.drawLine(x, y, x + xl + 40, y + yl + 20);  

        }  

          

        // add noise  

        float yawpRate = 0.05f;// noise rate  

        int area = (int) (yawpRate * w * h);  

        for (int i = 0; i < area; i++) {  

            int x = random.nextInt(w);  

            int y = random.nextInt(h);  

            int rgb = getRandomIntColor();  

            image.setRGB(x, y, rgb);  

        }  

          

        shear(g2, w, h, c);// distort the picture  

  

        g2.setColor(getRandColor(100, 160));  

        int fontSize = h-4;  

        Font font = new Font("Algerian", Font.ITALIC, fontSize);  

        g2.setFont(font);  

        char[] chars = code.toCharArray();  

        for(int i = 0; i < verifySize; i++){  

            AffineTransform affine = new AffineTransform();  

            affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);  

            g2.setTransform (affine);  

            g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i + 5, h/2 + fontSize/2 - 10);  

        }  

          

        g2.dispose();  

        ImageIO.write(image, "jpg", os);  

    }  

      

    private static Color getRandColor(int fc, int bc) {  

        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);  

    }  

      

    private static int getRandomIntColor() {  

        int[] rgb = getRandomRgb();  

        int color = 0;  

        for (int c : rgb) {  

            color = color << 8;  

            color = color | c;  

        }  

        return color;  

    }  

      

    private static int[] getRandomRgb() {  

        int[] rgb = new int[3];  

        for (int i = 0; i < 3; i++) {  

            rgb[i] = random.nextInt(255);  

        }  

        return rgb;  

    }  

  

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

        shearX(g, w1, h1, color);  

        shearY(g, w1, h1, color);  

    }  

      

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

  

        int period = random.nextInt(2);  

  

        boolean borderGap = true;  

        int frames = 1;  

        int phase = random.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 static void shearY(Graphics g, int w1, int h1, Color color) {  

  

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

  

        boolean borderGap = true;  

        int frames = 20;  

        int phase = 7;  

        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);  

            }  

  

        }  

  

    }  

    public static void main(String[] args) throws IOException{  

        File dir = new File("C:/verifies");  

        int w = 200, h = 80;  

        for(int i = 0; i < 50; i++){  

            String verifyCode = generateVerifyCode(4);  

            File file = new File(dir, verifyCode + ".jpg");  

            outputImage(w, h, file, verifyCode);  

        }  

    }  

}  

 

2. Servlet tool class

public class AuthImage extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {  

    static final long serialVersionUID = 1L;  

  

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

        response.setHeader("Pragma", "No-cache");  

        response.setHeader("Cache-Control", "no-cache");  

        response.setDateHeader("Expires", 0);  

        response.setContentType("image/jpeg");  

          

        //generate random string  

        String verifyCode = VerifyCodeUtils.generateVerifyCode(4);  

        //save session session  

        HttpSession session = request.getSession(true);  

        session.setAttribute("rand", verifyCode.toLowerCase());  

        //generate image  

        int w = 200, h = 80;  

        VerifyCodeUtils.outputImage(w, h, response.getOutputStream(), verifyCode);  

  

    }  

}  



 

 

Web.xml configuration file

<!DOCTYPE web-app PUBLIC

 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

  <display-name>Archetype Created Web Application</display-name>

  <servlet>  

   <servlet-name>VerifyCode</servlet-name>  

   <servlet-class>AuthImage</servlet-class>  

    </servlet>  

    <servlet-mapping>  

   <servlet-name>VerifyCode</servlet-name>  

   <url-pattern>/authImage</url-pattern>  

    </servlet-mapping>  

</web-app>

Front-end page code:

<html>

<head>

<link rel="shortcut icon" href="20150909100148424.png" type="image/x-icon" />  

<script type="text/javascript" src="jquery-1.8.3.min.js"></script> 

<script type="text/javascript">

$("#image").click(function (){

    alert("OK")

   //Get the current time as a parameter, because of the browser's caching technology, the picture will not be refreshed, so pass this parameter

   var timenow = new Date().getTime();

   $('#reloadImage').attr("src", "http://localhost:8080/upload/authImage?date=" + timenow);

});

</script>

 <script type="text/javascript">

  function changImg(){

   var img = document.getElementById("reloadImage");

   var d = new Date();

   var time = d.getTime();////Get the current time as a parameter, because the browser's caching technology, the picture will not refresh, so pass this parameter

   //If there is no this, the following sentence will not work, because of the browser's caching technology, the picture will not be refreshed

   img.src="http://localhost:8080/upload/authImage?date=" +time;

  }

 </script>

 </head>

<body>

<h2>Hello World! gaojingsong</h2>

 

<input type="text">   

<img id="reloadImage" src="http://localhost:8080/upload/authImage" width=100 height=50>

 <a href="javascript: changImg()" id="image">Can't see clearly, change one</a> 

</body>

</html>



 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326852619&siteId=291194637