生成圖形的縮略圖和動態的圖形的驗證碼
1,縮略圖是當今web站點,尤其是提供圖片信息瀏覽功能的網站,都會使用到的技術,它能夠有效的提高用戶瀏覽信息的速度。
2,縮略圖與原圖的本質區別是文件大小驟減,對于瀏覽型的圖片來說,縮略圖就是在不失去原有的瀏覽效果的前提下提高瀏覽速度的作用。
3,
...
response.setContentType("image/jpeg");
FileInputStream fin=new FileInputStream("E:\\Users\\lizi\\Workspaces\\MyEclipse 8.5\\JSPTest\\src\\javal.jpg");
Image src=ImageIO.read(fin);
int h=60;
int w=60;
BufferedImage tag=new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, w, h, null);
ImageIO.write(tag, "JPEG", response.getOutputStream());
...
4,圖形驗證碼是為了防止惡意注冊和登錄而設計的。有些惡意程序(如注冊機)可以進行不斷的注冊和登錄嘗試。如果沒有圖形驗證碼,web服務器會不堪重負,有時還會短時間內占滿服務器的磁盤空間。圖形驗證碼可以很好的解決這類問題,因為隨機的驗證碼是以圖形的方式呈現給用戶的,還包含了一些干擾點,只能肉眼才能看清楚驗證碼的值。
5,圖形驗證碼的原理其實很簡單,在用戶注冊或登錄前,生成一個隨機的驗證碼并保存在會話session中,用戶提交請求以后,首先驗證輸入的驗證碼是否正確,如果錯誤則直接返回。所以圖形驗證碼的核心在于如何使用java的2D圖形編程API來繪制生成的驗證碼和干擾點,然后再把生成的圖片對象寫到客戶端。
以下是使用動態圖形驗證碼的基本步驟:
(1)創建一個圖形對象。一般還要初始化背景顏色和邊框。
int width=60,height=20;//定義寬度和高度
//在內存中創建圖像
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();//獲取圖形上下文
g.setClor(new Color(0xDCDCDC));
g.fillRect(0,0,width,height);
g.setColr(Color.black);
g.drawRect(0,0,width-1,height-1);
(2)產生隨機數字。如果位數不足還需補零,以下是生成4位長度的隨機數字示例代碼:
//取隨機產生的驗證碼(4位)
//設置返回內容的MIME類型,這里是jpeg圖片。
response.setContentType("image/jpeg");
//為了保證每次的驗證碼每次訪問都是新的,需要指定驗證碼圖片不從瀏覽器緩存里獲得。
response.setHeader("Cache-Control","no-cache,nust-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Last-Modified", new Date().toString());
response.setDateHeader("Expires",0);
//在內存中創建圖像。
int width=60,height=20;
BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//設定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//畫邊框
g.setColor(Color.black);
g.drawRect(0, 0, width-1, height-1);
//隨機產生的驗證碼(4位數),小于4位的的前面補零。
Random r=new Random();
int rst=0;
while((rst=r.nextInt(10000))<0){
}
String rand=rst+"";
switch (rand.length()) {
case 1:
rand="000"+rand;
break;
case 2:
rand="00"+rand;
break;
case 3:
rand="0"+rand;
break;
default:
rand=rand.substring(0, 4);
break;
}
//將驗證碼存入session
request.getSession().setAttribute("rand",rand);
// 將驗證碼顯示到圖像中
g.setColor(Color.red);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
g.drawString(rand.charAt(0)+"",8 ,17);
g.drawString(rand.charAt(1)+"", 20, 15);
g.drawString(rand.charAt(2)+"", 35,18 );
g.drawString(rand.charAt(3)+"",45, 15);
//隨機產生50個干擾點,使圖像中的驗證碼不已被其他程序探測到
Random random=new Random();
for (int i = 0; i < 1500; i++) {
int x=random.nextInt(width);
int y=random.nextInt(width);
g.drawOval(x, y, 0, 0);
}
g.dispose();//圖形生效
//輸出圖形到頁面
ImageIO.write(image, "JPEG", response.getOutputStream());
2,縮略圖與原圖的本質區別是文件大小驟減,對于瀏覽型的圖片來說,縮略圖就是在不失去原有的瀏覽效果的前提下提高瀏覽速度的作用。
3,
...
response.setContentType("image/jpeg");
FileInputStream fin=new FileInputStream("E:\\Users\\lizi\\Workspaces\\MyEclipse 8.5\\JSPTest\\src\\javal.jpg");
Image src=ImageIO.read(fin);
int h=60;
int w=60;
BufferedImage tag=new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, w, h, null);
ImageIO.write(tag, "JPEG", response.getOutputStream());
...
4,圖形驗證碼是為了防止惡意注冊和登錄而設計的。有些惡意程序(如注冊機)可以進行不斷的注冊和登錄嘗試。如果沒有圖形驗證碼,web服務器會不堪重負,有時還會短時間內占滿服務器的磁盤空間。圖形驗證碼可以很好的解決這類問題,因為隨機的驗證碼是以圖形的方式呈現給用戶的,還包含了一些干擾點,只能肉眼才能看清楚驗證碼的值。
5,圖形驗證碼的原理其實很簡單,在用戶注冊或登錄前,生成一個隨機的驗證碼并保存在會話session中,用戶提交請求以后,首先驗證輸入的驗證碼是否正確,如果錯誤則直接返回。所以圖形驗證碼的核心在于如何使用java的2D圖形編程API來繪制生成的驗證碼和干擾點,然后再把生成的圖片對象寫到客戶端。
以下是使用動態圖形驗證碼的基本步驟:
(1)創建一個圖形對象。一般還要初始化背景顏色和邊框。
int width=60,height=20;//定義寬度和高度
//在內存中創建圖像
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();//獲取圖形上下文
g.setClor(new Color(0xDCDCDC));
g.fillRect(0,0,width,height);
g.setColr(Color.black);
g.drawRect(0,0,width-1,height-1);
(2)產生隨機數字。如果位數不足還需補零,以下是生成4位長度的隨機數字示例代碼:
//取隨機產生的驗證碼(4位)
//設置返回內容的MIME類型,這里是jpeg圖片。
response.setContentType("image/jpeg");
//為了保證每次的驗證碼每次訪問都是新的,需要指定驗證碼圖片不從瀏覽器緩存里獲得。
response.setHeader("Cache-Control","no-cache,nust-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Last-Modified", new Date().toString());
response.setDateHeader("Expires",0);
//在內存中創建圖像。
int width=60,height=20;
BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//設定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//畫邊框
g.setColor(Color.black);
g.drawRect(0, 0, width-1, height-1);
//隨機產生的驗證碼(4位數),小于4位的的前面補零。
Random r=new Random();
int rst=0;
while((rst=r.nextInt(10000))<0){
}
String rand=rst+"";
switch (rand.length()) {
case 1:
rand="000"+rand;
break;
case 2:
rand="00"+rand;
break;
case 3:
rand="0"+rand;
break;
default:
rand=rand.substring(0, 4);
break;
}
//將驗證碼存入session
request.getSession().setAttribute("rand",rand);
// 將驗證碼顯示到圖像中
g.setColor(Color.red);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
g.drawString(rand.charAt(0)+"",8 ,17);
g.drawString(rand.charAt(1)+"", 20, 15);
g.drawString(rand.charAt(2)+"", 35,18 );
g.drawString(rand.charAt(3)+"",45, 15);
//隨機產生50個干擾點,使圖像中的驗證碼不已被其他程序探測到
Random random=new Random();
for (int i = 0; i < 1500; i++) {
int x=random.nextInt(width);
int y=random.nextInt(width);
g.drawOval(x, y, 0, 0);
}
g.dispose();//圖形生效
//輸出圖形到頁面
ImageIO.write(image, "JPEG", response.getOutputStream());
posted on 2012-05-30 18:32 Mr Lee 閱讀(548) 評論(0) 編輯 收藏 所屬分類: java技術