彩色字體驗證碼



package com.fit;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
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 javax.servlet.http.HttpSession;

/**
 * Servlet implementation class CheckCode
 */
public class CheckCode extends HttpServlet {
 private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckCode() {
        super();
        // TODO Auto-generated constructor stub
    }

    private Color getRandColor(int s, int e) { 
        Random random = new Random(); 
        if (s > 255) 
            s = 255; 
        if (e > 255) 
            e = 255; 
        int r = random.nextInt(e - s) + s; // 隨機生成RGB中的R值 
        int g = random.nextInt(e - s) + s; // 隨機生成RGB中的G值 
        int b = random.nextInt(e - s) + s; // 隨機生成RGB中的B值 
        return new Color(r, g, b); 
    } 
 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
 
        this.doPost(request, response); 
    } 
 
    public void doPost(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"); 
        int width = 150;                            //指定生成驗證碼圖片的寬度 
        int heigh = 60;                         //指定生成驗證碼圖片的高度 
            //獲得圖像數據緩衝對象 
        BufferedImage bi = new BufferedImage(width,heigh,BufferedImage.TYPE_INT_RGB); 
            //獲得圖形上下文的抽象基類 
        Graphics g = bi.getGraphics(); 
        Random r = new Random(); 
        Font f = new Font("黑體",Font.PLAIN,60);  //定義字體樣式 
        g.setColor(getRandColor(200, 250));     //設置背景顏色 
        g.fillRect(0, 0, width, heigh);         //繪製背景 
        g.setFont(f);                           //設置字體 
        g.setColor(getRandColor(180, 200));     //設置前景顏色 
         
         
        Graphics2D g2d = (Graphics2D) g; 
        //畫一條折線      
        //BasicStroke bs=new BasicStroke(5f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //創建一個供畫筆選擇線條粗細的對象 
        //g2d.setStroke(bs);              //改變線條的粗細 
        g2d.setColor(Color.DARK_GRAY);      //設置當前顏色爲預定義顏色中的深灰色 
        int[] xPoints=new int[8]; 
        int[] yPoints=new int[8]; 
        for(int j=0;j<8;j++){ 
            xPoints[j]=r.nextInt(width - 1); 
            yPoints[j]=r.nextInt(heigh - 1); 
        } 
        g2d.drawPolyline(xPoints, yPoints,8); 
         
        String sRand = ""; 
        String ctmp = ""; 
        int itmp = 0; 
        for (int i = 0; i < 6; i++) { 
            switch (r.nextInt(2)) { 
            case 1: 
                itmp = r.nextInt(26) + 65; // 生成A~Z的字母 
                ctmp = String.valueOf((char) itmp); 
                break; 
            default: 
                itmp = r.nextInt(10) + 48; // 生成0~9的數字 
                ctmp = String.valueOf((char) itmp); 
                break; 
            } 
            sRand += ctmp; 
            //設置每個字符的隨機顏色 
            Color color = new Color(20 + r.nextInt(210), 20 + r.nextInt(210), 20 + r.nextInt(210)); 
            g2d.setColor(color); 
            //設置每個字符的隨機字體 
            g2d.setFont(this.getRandomFont()); 
            //設置每個字符的隨機旋轉 
            AffineTransform at = new AffineTransform(); 
            int number = r.nextInt(3)-1; 
            double role = number*r.nextDouble()*(Math.PI/4); 
            at.setToRotation(role,25*i+5,55-r.nextInt(20)); //role:旋轉角度,後面兩個參數是設置圍繞座標點旋轉 
            g2d.setTransform(at); 
             
            g2d.drawString(ctmp, 25*i+5,55-r.nextInt(20)); 
        } 
           HttpSession session = request.getSession(true); 
           session.setMaxInactiveInterval(5*60);//設置session對象5分鐘失效 
           session.setAttribute("code", sRand.toString()); 
 
           g2d.dispose(); 
 
            System.out.println(sRand); 
            ImageIO.write(bi, "JPEG", response.getOutputStream()); 
           
             
    } 
     
    
     public static Font getRandomFont() {   
            //String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};   
            String[] fonts = {"a_TrianglerCmUp","Astarisborn","WishfulWaves"}; 
            Random r = new  Random(); 
           int fontIndex = r.nextInt(fonts.length); 
            return new Font(fonts[fontIndex],  r.nextInt(3),50-r.nextInt(20));   
        } 
}


<body>
     <div><img src="checkcode" alt="驗證碼" id="check_image"/></div>
     <a href="javascript:;" id="checkcode_a">看不清,換一張</a>
</body>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>驗證碼測試</title>
<script type="text/javascript" src="js/jquery-1.11.0.js"></script>
<script type="text/javascript">
 $(document).ready(function(){
  var i = 1;
  $("#button").click(function(){
   i = i+1;
   var servletpath = "checkcode?a="+i;
   var img = "<img src='" + servletpath + "' width='120' height='60'/>";
   $("#image_div").html("");
   $("#image_div").html(img);
  });
 });
</script>
</head>
<body>
 <input type="button" id="button" value="showimage"/>
 <div id="image">
 sdfsdfsdfdsfsdf
 </div>
 <div id="image_div">
  <img alt="" src="" id="image_code">
 </div>
</body>

</html>


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