JSP驗證碼大全之Servlet實現

在以上的內容中闡述了在JSP中產生並實現了數字驗證碼、中文驗證碼的過程,以及如何在JSP中驗證碼調用和解決中文問題,並對驗證碼的使用做了分析。本 文將介紹另一種J2EE中驗證碼的產生跟使用,即在Servlet中定義驗證碼的產生並使用,通過將驗證碼的生成封裝到JAVA類中,更好的達到代碼跟頁 面分離的效果,因此提倡使用該方法。
   五、Servlet中實現四位數字驗證碼
   以下爲在Servlet中實現四位數字驗證碼的源碼分析。   import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.awt.*;
/*
* 功能:調用AuthCodeServlet可以生成一個4位數字的驗證碼圖片,驗證碼的圖片寬度和高度可以通過配置文件進行定義
* 驗證碼調用格式爲: /servlet/AuthCodeServlet?w=78&h=32
* 或者使用默認長寬/servlet/AuthCodeServlet
*/
   public class AuthCodeServlet extends HttpServlet {
   // 處理post
     public void doPost(HttpServletRequest req,HttpServletResponse res)
     throws ServletException,IOException {
     doGet(req,res);
}

   //設置字體
   private Font mFont=new Font("Times New Roman", Font.PLAIN,16);

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

      HttpSession session=request.getSession();
      response.setContentType("image/gif");
      response.setHeader("Pragma","No-cache");
      response.setHeader("Cache-Control","no-cache");
      response.setDateHeader("Expires", 0);
      int width=70; //驗證碼默認長度
      int height=24; //驗證碼默認寬度
      if(request.getParameter("w")!=null && !request.getParameter("w").equals(""))
        width = Integer.parseInt(request.getParameter("w"));
      if(request.getParameter("h")!=null && !request.getParameter("h").equals(""))
        height = Integer.parseInt(request.getParameter("h"));
                       
      ServletOutputStream out=response.getOutputStream(); //獲取輸出流
      BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //新建驗證圖片,並設置驗證碼圖片的大小
      Graphics gra=image.getGraphics(); //獲取圖形上下文
      Random random=new Random();
      gra.setColor(getRandColor(260,210));      //設置驗證碼的圖片背景色
      gra.fillRect(0,0,width,height);
      gra.setColor(Color.BLUE); //設置字體色爲藍色
      gra.setFont(mFont); //設置定義的字體格式

      // 隨機產生254條幹擾直線,使圖象中的驗證碼不易被解析程序分析到
      gra.setColor(getRandColor(110,240));
      for (int i=0;i<254;i++)
      {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
                  int xl = random.nextInt(63);
                  int yl = random.nextInt(64);
        gra.drawLine(x,y,x+xl,y+yl);
      }

      // 取隨機產生的驗證碼(4位數字)
      String sRand="";
      for (int i=0;i<4;i++){
      String rand=String.valueOf(random.nextInt(353));
      sRand+=rand;
      // 將認證碼顯示到圖象中
        gra.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
      //調用隨機函數構建隨機顏色三素
            gra.drawString(rand,13*i+6,16);
      }
            session.setAttribute("authCode",sRand);
            JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
}

   static Color getRandColor(int ff,int cc){
              //給定範圍獲得隨機顏色
              Random random = new Random();
              if(fc>255) ff=255;
              if(bc>255) cc=255;
              int r=ff+random.nextInt(cc-ff);
              int g=ff+random.nextInt(cc-ff);
              int b=ff+random.nextInt(cc-ff);
              return new Color(r,g,b);
   }
  
   static public String getAuthCode(HttpSession session){
     //返回驗證碼
     return (String)session.getAttribute("AuthCode");
   }
}

   以上即是通過Servlet中創建並生產數字驗證碼的源碼分析,下一篇文章將介紹在Servlet中生成數字字母混合驗證碼的過程,並說明如何對Servlet中的驗證碼進行使用。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章