隨筆-13  評論-12  文章-3  trackbacks-0
          import java.awt.Color;
          import java.awt.Font;
          import java.awt.Graphics;
          import java.awt.image.BufferedImage;
          import java.io.IOException;
          import java.io.OutputStream;
          import java.io.PrintWriter;
          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 com.sun.image.codec.jpeg.JPEGCodec;
          import com.sun.image.codec.jpeg.JPEGImageEncoder;

          public class Image extends HttpServlet {
           
          public void doGet(HttpServletRequest request, HttpServletResponse response)
             
          throws ServletException, IOException {
            response.setContentType(
          "image/jpeg");
            OutputStream out 
          = response.getOutputStream();
            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);
            
          // 獲取圖形上下文
            Graphics g = image.getGraphics();
            
          // 生成隨機類
            Random random = new Random();
            
          // 設定背景色
            g.setColor(getRandColor(200250));
            g.fillRect(
          00, width, height);
            
          // 設定字體
            g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            
          // 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
            g.setColor(getRandColor(180200));
            
          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);
            }
            
          // 取隨機產生的認證碼(4位數字)
            String sRand =setRandValue(request);
            
          if(sRand!=null)
            
          for (int i = 0; i < sRand.length(); i++) {
             g.setColor(
          new Color(20 + random.nextInt(200), 20 + random
               .nextInt(
          200), 20 + random.nextInt(200)));
             
          // 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
             g.drawString(sRand.charAt(i) + ""13 * i + 616);
            }
            
            JPEGImageEncoder encoder 
          = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            
          // 圖象生效
            g.dispose();
            
          // 輸出圖象到頁面
            
          // ImageIO.write(image, "JPG", response.getOutputStream());
            out.flush();
            out.close();
           }

           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);
           }
           
          //48-57對應0-9;65-90對應A-Z;97-122對應a-z;
           String setRandValue(HttpServletRequest request) {
            Random random 
          = new Random();
            String sRand 
          = "";
            
          //這里是生成驗證碼的位數
            for (int i = 0; i < 4; i++) {
             
          char c = 0;
             
          int k = random.nextInt(3);
             
          switch (k) {
             
          case 0:
              c 
          = (char) (random.nextInt(10+ 48);
              
          break;
             
          case 1:
              c 
          = (char) (random.nextInt(26+ 65);
              
          break;
             
          case 2:
              c 
          = (char) (random.nextInt(26+ 97);
             }
             sRand 
          += c;
            }
            request.getSession().setAttribute(
          "rands", sRand);
            
          return sRand;
           }
          }
          posted on 2011-01-03 20:51 zeroline 閱讀(1673) 評論(0)  編輯  收藏 所屬分類: Servlet/JSP

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 晋城| 天柱县| 广河县| 苏尼特左旗| 康定县| 砚山县| 商都县| 松滋市| 格尔木市| 新兴县| 马公市| 台前县| 揭西县| 安远县| 兴山县| 开封市| 修文县| 凤冈县| 广元市| 博罗县| 湾仔区| 天津市| 福海县| 收藏| 宁河县| 渝北区| 萝北县| 潞城市| 山东| 婺源县| 宾阳县| 武山县| 乌恰县| 永春县| 双江| 鸡西市| 鹿邑县| 沽源县| 大余县| 栾川县| 开封市|