生成圖片驗證碼的Servlet

package chat.servlet;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class CheckCodeImage extends HttpServlet {

    private static int WIDTH=64;

    private static int HEIGHT=20;

 

    /**

     * The doGet method of the servlet. <br>

     *

     * This method is called when a form has its tag value method equals to get.

     *

     * @param request the request send by the client to the server

     * @param response the response send by the server to the client

     * @throws ServletException if an error occurred

     * @throws IOException if an error occurred

     */

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       response.setContentType("image/jpeg");

       HttpSession session = request.getSession();

      

       //不設置緩存

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

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

       response.setDateHeader("Expires", 0);

      

       ServletOutputStream sos = response.getOutputStream();

      

       //創建內存圖像並獲取圖像上下文

       BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

       Graphics g = image.getGraphics();

      

       //產生隨機驗證碼

       char[] rands = generateCheckCode();

      

       //繪製圖像

       drawBackgound(g);

       drawRands(g,rands);

      

       //結束繪製

       g.dispose();

      

       //將圖像輸出到客戶端

       ByteArrayOutputStream bos = new ByteArrayOutputStream();

       ImageIO.write(image, "JPEG", bos);

       byte[] buf = bos.toByteArray();

       response.setContentLength(buf.length);

       sos.write(buf);

       bos.close();

       sos.close();

      

       //將驗證碼放在session中

       session.setAttribute("checkCode", new String(rands));

      

    }

 

    private void drawRands(Graphics g, char[] rands) {

       g.setColor(Color.BLACK);

       g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

       g.drawString("" + rands[0],1,17);

       g.drawString("" + rands[1],16,15);

       g.drawString("" + rands[2],31,18);

       g.drawString("" + rands[3],46,16);

    }

 

    private void drawBackgound(Graphics g) {

       g.setColor(new Color(0xDCDCDC));

       g.fillRect(0, 0, WIDTH, HEIGHT);

       //隨機產生120個干擾點

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

           int x = (int) (Math.random()*WIDTH);

           int y = (int) (Math.random()*HEIGHT);

           int red = (int) (Math.random()*255);

           int green = (int) (Math.random()*255);

           int blue = (int) (Math.random()*255);

           g.setColor(new Color(red,green,blue));

           g.drawOval(x, y, 1, 1);

       }

    }

 

    private char[] generateCheckCode() {

       String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

       char[] rands = new char[4];

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

           int rand = (int) (Math.random()*36);

           rands[i] = chars.charAt(rand);

       }

       return rands;

    }

 

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章