欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
圖形驗證碼的java通用類(lèi)
 - indexchen的專(zhuān)欄 - CSDNBlog

在應用程序中為防止系統被攻擊程序自動(dòng)訪(fǎng)問(wèn),通常提供一個(gè)人眼容易識別,但程序很難識別的圖形,圖形內是隨機產(chǎn)生的一些字符。為防止被攻擊程序自動(dòng)識別,字符通常會(huì )在位置和顏色上作隨機處理。

為便于使用,本人用 java實(shí)現了一個(gè)生成隨機字符圖片的通用類(lèi),封裝了生成過(guò)程的復雜性,能非常方便的使用。

實(shí)現類(lèi)類(lèi)名為RandomGraphic,它由一個(gè)靜態(tài)工廠(chǎng)方法createInstance(int charCount)來(lái)創(chuàng )建對象實(shí)例,charCount指定圖片中字符的個(gè)數,最多16個(gè)。

提供了兩個(gè)方法來(lái)生成隨機圖片,一個(gè)方法String drawNumber(String graphicFormat,OutputStream out) 生成的圖片中都是隨機數字,由0-9組成。

另一個(gè)方法String drawAlpha(String graphicFormat,OutputStream out)生成的圖片中都是隨機字母,由a-z組成,生成的字符個(gè)數在工廠(chǎng)方法中指定。將數字和圖片分開(kāi)是因為有些數字和字母人眼看上去很難區分,反而影響用戶(hù)輸入。

graphicFormat為生成圖片格式,取常量值GRAPHIC_JPEG 或 GRAPHIC_PNG

out用來(lái)輸出生成的圖片文件內容,可以是一個(gè)文件,或servlet中輸出到客戶(hù)端的流,以便于在頁(yè)面顯示。

 

下面給出原碼和在servlet中的示例代碼。

 

 

package net;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/**
 * 生成隨機數字或字母串,以圖像方式顯示,用于人工識別,使程序很難識別。
 *  減小系統被程序自動(dòng)攻擊的可能性。
 *  生成的圖形顏色由紅、黑、藍、紫4中隨機組合而成,數字或字母垂直方向位置在
 *  一定范圍內也是隨機的,減少被程序自動(dòng)識別的幾率。
 *  由于數字的0,1,2易和字母的o,l,z混淆,使人眼難以識別,因此不生成數字
 *  和字母的混合串。
 *  生成的串字母統一用小寫(xiě),串的最大長(cháng)度為16。
 *
 * @version
 *  @Since
 * @See Also
 * @author lchen
 * Create Date 2005-12-16
 *
 */

public class RandomGraphic {
 //字符的高度和寬度,單位為像素
 private int wordHeight = 10;
 private int wordWidth = 15;
 //字符大小
 private int fontSize = 16;
 //最大字符串個(gè)數
 private  static final int MAX_CHARCOUNT = 16;
 
 //垂直方向起始位置
 private final int initypos = 5;
 
 
 //要生成的字符個(gè)數,由工廠(chǎng)方法得到
 private int charCount = 0;
 
 
 //顏色數組,繪制字串時(shí)隨機選擇一個(gè)
 private static final Color[] CHAR_COLOR = {Color.RED,Color.BLUE,Color.GREEN,Color.MAGENTA};
 
 //隨機數生成器
 private Random r = new Random();
 
 /**
  * 生成圖像的格式常量,JPEG格式,生成為文件時(shí)擴展名為.jpg;
  * 輸出到頁(yè)面時(shí)需要設置MIME type 為image/jpeg
  */
 public static String GRAPHIC_JPEG = "JPEG";
 /**
  * 生成圖像的格式常量,PNG格式,生成為文件時(shí)擴展名為.png;
  * 輸出到頁(yè)面時(shí)需要設置MIME type 為image/png
  */
 public static String GRAPHIC_PNG = "PNG";
 
 
 
 //用工廠(chǎng)方法創(chuàng )建對象
 protected RandomGraphic(int charCount){
  this.charCount = charCount;
 }
 
 
 /**
  * 創(chuàng )建對象的工廠(chǎng)方法
  * @param charCount  要生成的字符個(gè)數,個(gè)數在1到16之間
  *
  * Return 返回RandomGraphic對象實(shí)例
  * @throws Exception  參數charCount錯誤時(shí)拋出
  */
 public static RandomGraphic createInstance(int charCount) throws Exception{
  if (charCount < 1 || charCount > MAX_CHARCOUNT){
   throw new Exception("Invalid parameter charCount,charCount should between in 1 and 16");
  }
  return new RandomGraphic(charCount);
 }
 
 
 /**
  * 隨機生成一個(gè)數字串,并以圖像方式繪制,繪制結果輸出到流out中
  *
  * @param graphicFormat 設置生成的圖像格式,值為GRAPHIC_JPEG或GRAPHIC_PNG
  * @param out  圖像結果輸出流
  * @return   隨機生成的串的值
  * @throws IOException
  */
 public String drawNumber(String graphicFormat,OutputStream out) throws IOException{
//  隨機生成的串的值
  String charValue = "";
  charValue = randNumber();
  return draw(charValue,graphicFormat,out);
  
 }

 /**
  * 隨機生成一個(gè)字母串,并以圖像方式繪制,繪制結果輸出到流out中
  *
  * @param graphicFormat 設置生成的圖像格式,值為GRAPHIC_JPEG或GRAPHIC_PNG
  * @param out  圖像結果輸出流
  * @return   隨機生成的串的值
  * @throws IOException
  */
 public String drawAlpha(String graphicFormat,OutputStream out) throws IOException{
//  隨機生成的串的值
  String charValue = "";
  charValue = randAlpha();
  return draw(charValue,graphicFormat,out);
  
 }

 
 
 
 
 /**
  * 以圖像方式繪制字符串,繪制結果輸出到流out中
  * @param charValue  要繪制的字符串
  * @param graphicFormat 設置生成的圖像格式,值為GRAPHIC_JPEG或GRAPHIC_PNG
  * @param out  圖像結果輸出流
  * @return   隨機生成的串的值
  * @throws IOException
  */
 protected String draw(String charValue,String graphicFormat,OutputStream out) throws IOException{
  
  //計算圖像的寬度和高度
  int w = (charCount+2) * wordWidth;
  int h = wordHeight * 3;

  //創(chuàng )建內存圖像區
  BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_3BYTE_BGR);
  Graphics2D g = bi.createGraphics();
  
  //設置背景色
  Color backColor = Color.WHITE;
  g.setBackground(backColor);
  g.fillRect(0,0,w,h);
  
  //設置font
  g.setFont(new Font(null,Font.BOLD,fontSize));
  //繪制charValue,每個(gè)字符顏色隨機
  for(int i = 0; i < charCount; i++){
   String c = charValue.substring(i,i+1);
   Color color =  CHAR_COLOR[randomInt(0,CHAR_COLOR.length)];
   g.setColor(color);
   int xpos = (i+1) * wordWidth;
   //垂直方向上隨機
   int ypos = randomInt(initypos+wordHeight,initypos+wordHeight*2);
   g.drawString(c,xpos,ypos);
  }
  g.dispose();
  bi.flush();
  // 輸出到流
  ImageIO.write(bi,graphicFormat,out);
  
  return charValue;
 }
 
 
 
 
 protected String randNumber(){
  String charValue = "";
  //生成隨機數字串
  for (int i = 0; i < charCount; i++){
   charValue += String.valueOf(randomInt(0,10));
  }
  return charValue;
 }
 
 
 private String randAlpha(){
  String charValue = "";
  //生成隨機字母串
  for (int i = 0; i < charCount; i++){
   char c = (char) (randomInt(0,26)+‘a(chǎn)‘);
   charValue += String.valueOf(c);
  }
  return charValue;
 }
 
 
 
 /**
  * 返回[from,to)之間的一個(gè)隨機整數
  *
  * @param from 起始值
  * @param to 結束值
  * @return  [from,to)之間的一個(gè)隨機整數
  */
 protected int randomInt(int from,int to){
  //Random r = new Random();
  return from+r.nextInt(to-from);
 }
 
 
 
 /**
  * @param args
  * @throws Exception
  */
 public static void main(String[] args) throws Exception {
 
  System.out.println(RandomGraphic.createInstance(5).drawAlpha(RandomGraphic.GRAPHIC_PNG,new FileOutputStream("c:/myimg.png")));

  
 }
 
}

RandomGraphic類(lèi)原代碼結束

 

在servlet中使用該類(lèi),將圖片輸出到客戶(hù)端,在頁(yè)面上就可顯示隨機圖片

package net;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RandImage extends HttpServlet {

 public RandImage() {
  super();
 
 }

 
 
 protected void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException,ServletException{

//設置輸出內容為圖像,格式為jpeg
  res.setContentType("image/jpg");
  try {
//將內容輸出到響應客戶(hù)端對象的輸出流中,生成的圖片中包含6個(gè)字符

   String v = RandomGraphic.createInstance(6).drawAlpha(RandomGraphic.GRAPHIC_JPEG,res.getOutputStream());
//將字符串的值保留在session中,便于和用戶(hù)手工輸入的驗證碼比較,比較部分不是本文討論重點(diǎn),故略

   req.getSession().setAttribute("rv",v);
  } catch (Exception e) {
  
   e.printStackTrace();
  }
 
 }

 
}


需要在web.xml中配置該servlet

 <servlet>
   <servlet-name>RandImage</servlet-name>
   <servlet-class>net.RandImage</servlet-class>
  </servlet>
  
  <servlet-mapping>
   <servlet-name>RandImage</servlet-name>
   <url-pattern>/RandImage</url-pattern>
  </servlet-mapping>

 

然后在一個(gè)頁(yè)面中用下面的代碼來(lái)顯示圖片

<html>
<body>

驗證碼: <image src="RandImage" />


</body>
</html>

 

要增加圖片的識別難度,還可以在draw方法中對圖象進(jìn)行一定程度變形回旋轉處理,或者在圖片中添加隨機干擾線(xiàn)條,但要保證用人眼能比較容易識別。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java web 文件上傳與下載
jsp+servlet實(shí)現注冊登錄,不用數據庫
自己寫(xiě)的一個(gè)JSP上傳文件和下載文件的JavaBean
使用commons-fileupload例子--孤獨的日子
使用Servlet動(dòng)態(tài)生成圖片
get/post方式調用http接口
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久