使用Servlet實現網頁驗證碼功能

servlet:

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

// TODO Auto-generated method stub

int width=80;//驗證碼圖片寬度    

 int height=30;//驗證碼圖片高度    

 BufferedImage p_w_picpath=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);    

 Graphics g=p_w_picpath.getGraphics();    

 Random random=new Random();//創建一個隨機類    

 g.setColor(getRandColor(200,250));//背景顏色要偏淡    

 g.fillRect(0, 0, width, height);//畫背景    

 g.setColor(getRandColor(0,255));//邊框顏色    

       g.drawRect(0, 0, width-1, height-1);//畫邊框    

 g.setColor(getRandColor(160,200));// 隨機產生5條幹擾線,使圖象中的認證碼不易被其它程序探測到    

 for(int i=0;i<8;i++){    

  int x=random.nextInt(width);    

  int y=random.nextInt(height);    

  int x1=random.nextInt(width);    

  int y1=random.nextInt(height);    

  g.drawLine(x, y, x1, y1);    

 }    

 g.setColor(getRandColor(160,200));// 隨機產生100點,使圖象中的認證碼不易被其它程序探測到    

 for(int i=0;i<100;i++){    

  int x=random.nextInt(width);    

  int y=random.nextInt(height);    

  g.drawLine(x, y, x, y);    

 }    

       Font font = new Font("Times New Roman", Font.ITALIC,26);  // 創建字體,字體的大小應該根據圖片的高度來定。    

       g.setFont(font);//設置字體    

       int length = 4;  // 設置默認生成4個驗證碼    

 String s="abcdefghijklmnopqrstuvwxyz0123456789"; // 設置備選驗證碼:包括"a-z"和數字"0-9"    

 String sRand="";    

       

       // 用隨機產生的顏色將驗證碼繪製到圖像中。    

       // 生成隨機顏色(因爲是做前景,所以偏深)      

       //調用函數出來的顏色相同,可能是因爲種子太接近,所以只能直接生成    

       g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));      

 for(int i=0;i<length;i++){    

  String ch=String .valueOf(s.charAt(random.nextInt(s.length())));    

  sRand+=ch;    

  g.drawString(ch, 12*i+12, (random.nextInt(5)-2)*i+20);    

 }    

 //將生成的字符串存儲在session中    

 HttpSession session=request.getSession();      

 session.setAttribute("checkCode", sRand);    

 g.dispose();//圖像生效    

 //禁止圖像緩存    

 response.setHeader("Pragma", "No-cache");    

 response.setHeader("Cache-Control", "no-cache");    

 response.setDateHeader("Expires", 0);      

 response.setContentType("p_w_picpath/jpeg");    

 //創建二進制的輸出流    

 ServletOutputStream sos=response.getOutputStream();    

       // 將圖像輸出到Servlet輸出流中。    

       ImageIO.write(p_w_picpath, "jpeg", sos);    

       sos.flush();    

       sos.close();    

}

public Color getRandColor(int lower,int upper){    

 Random random = new Random();    

 if(upper>255)    

  upper=255;    

 if(upper<1)    

  upper=1;    

 if(lower<1)    

  lower=1;    

 if(lower>255)    

  lower=255;    

 int r=lower+random.nextInt(upper-lower);    

 int g=lower+random.nextInt(upper-lower);    

 int b=lower+random.nextInt(upper-lower);    

 return new Color(r,g,b);    

}    


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