posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          這是我以前做BBS時(shí)候用的一個(gè)驗(yàn)證碼機(jī)制。

          register.jsp + RegistServlet.java +web.xml + RandomValidateCode.java

          register.jsp 頁(yè)面:

          <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
          <%
          String path = request.getContextPath();
          String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"
          ;
          %>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <base href="<%=basePath% />"/>
          <title>注冊(cè)首頁(yè)面</title>
          </style>
          </head>
          <body>
          <form action="register.do" name="registerForm">
          <table border="0" width="798" height="146">    
           
          <tr>

            
          <td > 驗(yàn)證碼:</td>
            
          <td ><input type="text" size="20" name="validate" />
            
          <td ><img src="validate.do" onclick="javascript:this.src='validate.do?ran='+Math.random()"    alt="" />(如果看不清請(qǐng)點(diǎn)擊圖片進(jìn)行更換)</td>
           
          </tr>
          </table>   
          <img src="images/button/register.jpg" type="submit" style="cursor:pointer" />

          </form>
          </body>
          </html>



          RegistServlet.java:

           

          package com.handson.bbs.servlet;
          import
           java.io.IOException;
          import
           javax.servlet.ServletException;
          import
           javax.servlet.http.HttpServletRequest;
          import
           javax.servlet.http.HttpServletResponse;
          import
           com.handson.commons.util.RandomValidateCode;
          public class RegisterServlet extends BaseServlet 
          {
           
          public void
           doGet(HttpServletRequest request, HttpServletResponse response)
             
          throws ServletException, IOException 

            String validate 
          = request.getParameter("validate"
          );  
            String sessionValidate 
          =
           RandomValidateCode.getValidateCodeFromSession(request.getSession());  
            
          if(!validate.equals(sessionValidate))
          {
             request.setAttribute(
          "error""請(qǐng)正確輸入驗(yàn)證碼!"
          );
             
          this.forward(request, response, "/register.jsp"
          );
             
          return
          ;
            }

            
           }

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

            
          this
          .doGet(request, response);
           }


          }



          web.xml 配置:

          <servlet>
            
          <servlet-name>validateCodeServlet</servlet-name>
            
          <servlet-class>com.handson.commons.util.ValidateCodeServlet</servlet-class>
           
          </servlet>
          <servlet-mapping>
            
          <servlet-name>validateCodeServlet</servlet-name>
            
          <url-pattern>/validate.do</url-pattern>
           
          </servlet-mapping>



          RandomValidateCode.java:

          package com.handson.commons.util;
          import java.util.*;
          import java.awt.*;
          import java.awt.image.*;
          import javax.imageio.*;
          import java.io.*;
          import javax.servlet.http.*;

          /**
           * @descripte create validate code
           * @author Gavin.lee
           * @date 2009-5-14 22:58
           *
           */
          public class RandomValidateCode {
           public static final String KEY_VALIDATE_CODE = "validate_code";
           public static final int DIGITAL_VALIDATE_CODE = 1; //數(shù)字型驗(yàn)證碼
           public static final int LETTER_VALIDATE_CODE = 2;  //字母型驗(yàn)證碼
           public static final int MIX_VALIDATE_CODE = 3;  //數(shù)字和字母混合型驗(yàn)證碼
           
           private static final String PIC_FORMAT = "JPEG";
           private int numberCount = 4;
           private BufferedImage image;
           private int width = 72;
           private int height= 24;
           private String validateCode;
           private Font font = new Font("Times New Roman",Font.PLAIN,20);
           private int validateCodeType = DIGITAL_VALIDATE_CODE;
           
           public RandomValidateCode() {
            this(DIGITAL_VALIDATE_CODE);
           }
           
           public RandomValidateCode(int validateCodeType) {
            if(validateCodeType == DIGITAL_VALIDATE_CODE 
              || validateCodeType == MIX_VALIDATE_CODE
              || validateCodeType == LETTER_VALIDATE_CODE) {
             this.validateCodeType = validateCodeType;
            }
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            generateImage();
           }
           
           /**
            * 給定范圍獲得隨機(jī)顏色
            * @param colorFrom
            * @param colorEnd
            * @return
            */
           private Color generateRandomColor(int colorFrom, int colorEnd) {
            Random random = new Random();
            colorFrom = colorFrom > 255 ? 255 : colorFrom;
            colorEnd  = colorEnd > 255 ? 255 : colorEnd;
            int red = colorFrom + random.nextInt(colorEnd - colorFrom);
            int green = colorFrom + random.nextInt(colorEnd - colorFrom);
            int blue = colorFrom + random.nextInt(colorEnd - colorFrom);
            return new Color(red, green, blue);
           }
           
           private void generateImage() {
            Graphics g = image.getGraphics(); //獲取圖形上下文
            Random random = new Random();
            g.setFont(font);
            drawBackground(g, random);
            
            StringBuffer strBuf = new StringBuffer();
            int count = 0;
            while(count 
          < numberCount
          ) {
             int randNum 
          = random.nextInt((int)'z');
             
          if(this.validateCodeType == 
          MIX_VALIDATE_CODE && ! Character.isLetterOrDigit(randNum)) {
              continue;
             } else if(this.validateCodeType 
          == 
          DIGITAL_VALIDATE_CODE && ! Character.isDigit(randNum)) { //只顯示數(shù)字驗(yàn)證碼
              continue;
             } else if(this.validateCodeType 
          == 
          LETTER_VALIDATE_CODE && ! Character.isLetter(randNum)) { //只顯示數(shù)字驗(yàn)證碼
              continue;
             }
             
             // 將認(rèn)證碼顯示到圖象中
             String randChar 
          = String.valueOf((char)randNum);
             
          g.setColor(new Color(30+random.nextInt(110), 30+random.nextInt(110), 30+random.nextInt(110)));
             g.drawString(randChar, 16*count+4, 18);
             strBuf.append(randChar);
             count++;
            }
            validateCode 
          = strBuf.toString();
            
          g.dispose();//釋放圖形相關(guān)資源
           }

           private void drawBackground(Graphics g, Random random) {
            //設(shè)定背景色
            g.setColor(generateRandomColor(210, 250));
            g.fillRect(0, 0, width, height);
            g.setColor(new Color(255, 255, 255));
            g.drawRect(0, 0, width-1, height-1); //畫(huà)邊框
            
            //隨機(jī)產(chǎn)生155條干擾線(xiàn),使圖象中的認(rèn)證碼不易被其它程序探測(cè)到
            g.setColor(generateRandomColor(160,200));
            for(int i 
          = 0; 
          i < 155; i++) {
             int x 
          = random.nextInt(width);
             
          int y 
          = random.nextInt(height);
             
          int xl 
          = random.nextInt(16);
             
          int yl 
          = random.nextInt(16);
             
          g.drawLine(x,y,x+xl,y+yl);
            }
           }
            
           public void outputImage(OutputStream outputStream) {
            if(outputStream 
          == 
          null)
             return;
            
            try {
             ImageIO.write(image, PIC_FORMAT, outputStream);
            } catch (IOException e) {
             e.printStackTrace();
            }
           }
           
           public String getValidateCode() {
            return this.validateCode;
           }
           
           public void bindingRequest(HttpServletRequest request, HttpServletResponse response) { 
            try {
             //set the random number into session
             request.getSession().setAttribute(KEY_VALIDATE_CODE, validateCode);
             
             //set page to no cache for Web Browser
             response.reset();
             response.setContentType("image/*");
             response.setHeader("Pragma","No-cache");
             response.setHeader("Cache-Control","no-cache");
             response.setDateHeader("Expires", 0);

             //output the image stream into response
             outputImage(response.getOutputStream());
            } catch (IOException e) {
             e.printStackTrace();
            }
           }
           
           public static String getValidateCodeFromSession(HttpSession session) {
            return (String)session.getAttribute(KEY_VALIDATE_CODE);
           }
           
           public static void removeValidateCodeFromSession(HttpSession session) {
            session.removeAttribute(KEY_VALIDATE_CODE);
           }
           
          }

          主站蜘蛛池模板: 永定县| 溧阳市| 土默特左旗| 勃利县| 上虞市| 讷河市| 陕西省| 临桂县| 民和| 泗水县| 南溪县| 通海县| 娱乐| 准格尔旗| 郧西县| 潢川县| 恩平市| 佛教| 托克托县| 青岛市| 石景山区| 十堰市| 衢州市| 库尔勒市| 曲靖市| 峡江县| 青铜峡市| 鸡泽县| 贵阳市| 九台市| 黄大仙区| 嘉峪关市| 汾西县| 竹山县| 门源| 抚远县| 讷河市| 太和县| 邓州市| 丁青县| 平安县|