JAVAWEB學習製作自己的小說管理網站-day02

Author AhahaGe

主要實現了創建驗證碼servlet,以及刷新驗證碼功能

創建驗證碼主要做以下幾個步驟:

  • 建一個bufferedImage,來存放可改變的image
  • 得到graphics2D來渲染2維的image,設置顏色setColor()和字體setFont()
  • 用drawRect()方法畫矩形
  • 用fillRect()方法填充矩形
  • 用drawLine()方法畫干擾線
  • 用drawString()方法畫驗證碼
  • 瀏覽器設置不緩存
  • 設置返回類型爲image
  • 用ImageIO把bufferedImage寫入servletOutputStream

Step1:創建驗證碼servlet,類名爲ValidateCodeServlet

  1. package servlet;  
  2.  
  3. import java.awt.Color;  
  4. import java.awt.Font;  
  5. import java.awt.Graphics2D;  
  6. import java.awt.image.BufferedImage;  
  7. import java.io.IOException;  
  8. import java.util.Random;  
  9.  
  10. import javax.imageio.ImageIO;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.ServletOutputStream;  
  13. import javax.servlet.http.HttpServlet;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16. import javax.servlet.http.HttpSession;  
  17.  
  18. /**  
  19.  * create a validateCode image and validate user's input  
  20.  * @author Ahaha_Ge  
  21.  *  
  22.  */ 
  23. public class ValidateCodeServlet extends HttpServlet{  
  24.  
  25.     private static final long serialVersionUID = 1L;  
  26.  
  27.     @Override 
  28.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  29.             throws ServletException, IOException {  
  30.         doPost(req,resp);  
  31.     }  
  32.  
  33.     /**  
  34.      * generate validateCode image  
  35.      * image shape is rectangular with some lines and codes  
  36.      * codeCount is 4, code should contain 26 English chars and number  
  37.      */ 
  38.     @Override 
  39.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  40.             throws ServletException, IOException {  
  41.           
  42.         int width = 160;  
  43.         int height = 40;  
  44.         int codeCount = 4;  
  45.         Random r = new Random();  
  46.         //create a buffered image instance  
  47.         BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
  48.         //create a graphics to render the image  
  49.         Graphics2D g = bi.createGraphics();  
  50.         //set context color and fill rectangular  
  51.         g.setColor(setRandomColor());  
  52.         g.fillRect(00, width-1, height-1);  
  53.         //set context color and draw rectangular  
  54.         g.setColor(setRandomColor());  
  55.         g.drawRect(00, width-1, height-1);  
  56.         //draw disturb lines  
  57.         for(int i=0; i<5; i++){  
  58.             g.setColor(setRandomColor());  
  59.             g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));  
  60.         }  
  61.         //set font  
  62.         Font font = new Font("font",Font.PLAIN,height*3/4);  
  63.         g.setFont(font);  
  64.         //create and draw codes  
  65.         String codes = generateCodes(codeCount);  
  66.         for(int i=0; i<codes.length(); i++){  
  67.             g.drawString(String.valueOf(codes.charAt(i)), width*(i+1)/(codeCount+1), height*7/8);  
  68.         }  
  69.         //put codes into session  
  70.         HttpSession session = req.getSession();  
  71.         session.setAttribute("validateCode", codes);  
  72.         //forbid cache  
  73.         resp.setHeader("Pragma""no-cache");  
  74.         resp.setHeader("Cache-Control""no-cache");  
  75.         resp.setDateHeader("expires"0);  
  76.         resp.setContentType("image/jpeg");  
  77.         //send image to output stream  
  78.         ServletOutputStream sos = resp.getOutputStream();  
  79.         ImageIO.write(bi, "jpeg", sos);  
  80.         sos.close();  
  81.     }  
  82.       
  83.     //set Random color  
  84.     private Color setRandomColor(){  
  85.         int r = new Random().nextInt(256);  
  86.         int g = new Random().nextInt(256);  
  87.         int b = new Random().nextInt(256);  
  88.         Color c = new Color(r,g,b);  
  89.         return c;  
  90.     }  
  91.       
  92.     //create codes set  
  93.     private char[] createCodesSet(){  
  94.         char[] c = new char[62];  
  95.         for(int i=0; i<26; i++){  
  96.             //add A to Z  
  97.             c[i] = (char)(i+65);  
  98.             //add a to z  
  99.             c[26+i] = (char)(i+97);  
  100.         }  
  101.         for(int i=0; i<10; i++){  
  102.             //add 0 to 9  
  103.             c[52+i] = (char)(i+48);  
  104.         }  
  105.         return c;  
  106.     }  
  107.       
  108.     //create n codes  
  109.     private String generateCodes(int n){  
  110.         //codes set  
  111.         char[] codes = createCodesSet();  
  112.         StringBuffer sb = new StringBuffer();  
  113.         for(int i=0;i<n;i++){  
  114.             sb.append(codes[new Random().nextInt(codes.length)]);  
  115.         }  
  116.         return sb.toString();     
  117.     }  
  118.       
  119.     public static void main(String[] args){  
  120.         System.out.println(new ValidateCodeServlet().setRandomColor());  
  121.     }  
  122.       
  123. }  

Step2: 在web.xml中配置寫好的ValidateCodeServelt

  1. <servlet> 
  2.     <servlet-name>validateCodeServlet</servlet-name> 
  3.     <servlet-class>servlet.ValidateCodeServlet</servlet-class> 
  4. </servlet> 
  5. <servlet-mapping> 
  6.     <servlet-name>validateCodeServlet</servlet-name> 
  7.     <url-pattern>/validateCodeServlet</url-pattern> 
  8. </servlet-mapping> 

Step3: 在使用驗證碼的地方,創建一個image控件,再改變src爲ValidateCodeServlet

  1. <input type="image" id="image" width="160" height="40" name="code" src="validateCodeServlet"/> 

Step4: 用javascript來實現刷新驗證碼,寫一個按鈕,當點擊它時,定義一個方法,改變image控件的src,不要忘了newDate(),不然生成的驗證碼是一樣的。

  1. <input type="button" name="fresh" value="fresh" onclick="freshValidateCode();"/> 
  1. <script type="text/javascript">  
  2.         function freshValidateCode()  
  3.         {     
  4.             document.getElementById("image").setAttribute("src","validateCodeServlet?"+new Date());  
  5.         }  
  6.     </script> 

總結:這麼簡單的功能寫了兩天,第一天竟然被畫驗證碼給嚇住了,這麼多代碼,這麼多類,現在回過來看看,發現還是挺簡單的,主要是參考了網上的代碼,跟着理解了一遍,做了兩遍,做的時候總是會忘,總是會出小錯,終於作出來了,接着得寫上傳下載。

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