生成圖形的縮略圖和動(dòng)態(tài)的圖形的驗(yàn)證碼
1,縮略圖是當(dāng)今web站點(diǎn),尤其是提供圖片信息瀏覽功能的網(wǎng)站,都會(huì)使用到的技術(shù),它能夠有效的提高用戶(hù)瀏覽信息的速度。
2,縮略圖與原圖的本質(zhì)區(qū)別是文件大小驟減,對(duì)于瀏覽型的圖片來(lái)說(shuō),縮略圖就是在不失去原有的瀏覽效果的前提下提高瀏覽速度的作用。
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,圖形驗(yàn)證碼是為了防止惡意注冊(cè)和登錄而設(shè)計(jì)的。有些惡意程序(如注冊(cè)機(jī))可以進(jìn)行不斷的注冊(cè)和登錄嘗試。如果沒(méi)有圖形驗(yàn)證碼,web服務(wù)器會(huì)不堪重負(fù),有時(shí)還會(huì)短時(shí)間內(nèi)占滿(mǎn)服務(wù)器的磁盤(pán)空間。圖形驗(yàn)證碼可以很好的解決這類(lèi)問(wèn)題,因?yàn)殡S機(jī)的驗(yàn)證碼是以圖形的方式呈現(xiàn)給用戶(hù)的,還包含了一些干擾點(diǎn),只能肉眼才能看清楚驗(yàn)證碼的值。
5,圖形驗(yàn)證碼的原理其實(shí)很簡(jiǎn)單,在用戶(hù)注冊(cè)或登錄前,生成一個(gè)隨機(jī)的驗(yàn)證碼并保存在會(huì)話(huà)session中,用戶(hù)提交請(qǐng)求以后,首先驗(yàn)證輸入的驗(yàn)證碼是否正確,如果錯(cuò)誤則直接返回。所以圖形驗(yàn)證碼的核心在于如何使用java的2D圖形編程API來(lái)繪制生成的驗(yàn)證碼和干擾點(diǎn),然后再把生成的圖片對(duì)象寫(xiě)到客戶(hù)端。
以下是使用動(dòng)態(tài)圖形驗(yàn)證碼的基本步驟:
(1)創(chuàng)建一個(gè)圖形對(duì)象。一般還要初始化背景顏色和邊框。
int width=60,height=20;//定義寬度和高度
//在內(nèi)存中創(chuàng)建圖像
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)產(chǎn)生隨機(jī)數(shù)字。如果位數(shù)不足還需補(bǔ)零,以下是生成4位長(zhǎng)度的隨機(jī)數(shù)字示例代碼:
//取隨機(jī)產(chǎn)生的驗(yàn)證碼(4位)
//設(shè)置返回內(nèi)容的MIME類(lèi)型,這里是jpeg圖片。
response.setContentType("image/jpeg");
//為了保證每次的驗(yàn)證碼每次訪(fǎng)問(wèn)都是新的,需要指定驗(yàn)證碼圖片不從瀏覽器緩存里獲得。
response.setHeader("Cache-Control","no-cache,nust-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Last-Modified", new Date().toString());
response.setDateHeader("Expires",0);
//在內(nèi)存中創(chuàng)建圖像。
int width=60,height=20;
BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//設(shè)定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//畫(huà)邊框
g.setColor(Color.black);
g.drawRect(0, 0, width-1, height-1);
//隨機(jī)產(chǎn)生的驗(yàn)證碼(4位數(shù)),小于4位的的前面補(bǔ)零。
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;
}
//將驗(yàn)證碼存入session
request.getSession().setAttribute("rand",rand);
// 將驗(yàn)證碼顯示到圖像中
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);
//隨機(jī)產(chǎn)生50個(gè)干擾點(diǎn),使圖像中的驗(yàn)證碼不已被其他程序探測(cè)到
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();//圖形生效
//輸出圖形到頁(yè)面
ImageIO.write(image, "JPEG", response.getOutputStream());
2,縮略圖與原圖的本質(zhì)區(qū)別是文件大小驟減,對(duì)于瀏覽型的圖片來(lái)說(shuō),縮略圖就是在不失去原有的瀏覽效果的前提下提高瀏覽速度的作用。
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,圖形驗(yàn)證碼是為了防止惡意注冊(cè)和登錄而設(shè)計(jì)的。有些惡意程序(如注冊(cè)機(jī))可以進(jìn)行不斷的注冊(cè)和登錄嘗試。如果沒(méi)有圖形驗(yàn)證碼,web服務(wù)器會(huì)不堪重負(fù),有時(shí)還會(huì)短時(shí)間內(nèi)占滿(mǎn)服務(wù)器的磁盤(pán)空間。圖形驗(yàn)證碼可以很好的解決這類(lèi)問(wèn)題,因?yàn)殡S機(jī)的驗(yàn)證碼是以圖形的方式呈現(xiàn)給用戶(hù)的,還包含了一些干擾點(diǎn),只能肉眼才能看清楚驗(yàn)證碼的值。
5,圖形驗(yàn)證碼的原理其實(shí)很簡(jiǎn)單,在用戶(hù)注冊(cè)或登錄前,生成一個(gè)隨機(jī)的驗(yàn)證碼并保存在會(huì)話(huà)session中,用戶(hù)提交請(qǐng)求以后,首先驗(yàn)證輸入的驗(yàn)證碼是否正確,如果錯(cuò)誤則直接返回。所以圖形驗(yàn)證碼的核心在于如何使用java的2D圖形編程API來(lái)繪制生成的驗(yàn)證碼和干擾點(diǎn),然后再把生成的圖片對(duì)象寫(xiě)到客戶(hù)端。
以下是使用動(dòng)態(tài)圖形驗(yàn)證碼的基本步驟:
(1)創(chuàng)建一個(gè)圖形對(duì)象。一般還要初始化背景顏色和邊框。
int width=60,height=20;//定義寬度和高度
//在內(nèi)存中創(chuàng)建圖像
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)產(chǎn)生隨機(jī)數(shù)字。如果位數(shù)不足還需補(bǔ)零,以下是生成4位長(zhǎng)度的隨機(jī)數(shù)字示例代碼:
//取隨機(jī)產(chǎn)生的驗(yàn)證碼(4位)
//設(shè)置返回內(nèi)容的MIME類(lèi)型,這里是jpeg圖片。
response.setContentType("image/jpeg");
//為了保證每次的驗(yàn)證碼每次訪(fǎng)問(wèn)都是新的,需要指定驗(yàn)證碼圖片不從瀏覽器緩存里獲得。
response.setHeader("Cache-Control","no-cache,nust-revalidate");
response.setHeader("Pragma", "no-cache");
response.setHeader("Last-Modified", new Date().toString());
response.setDateHeader("Expires",0);
//在內(nèi)存中創(chuàng)建圖像。
int width=60,height=20;
BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//設(shè)定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//畫(huà)邊框
g.setColor(Color.black);
g.drawRect(0, 0, width-1, height-1);
//隨機(jī)產(chǎn)生的驗(yàn)證碼(4位數(shù)),小于4位的的前面補(bǔ)零。
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;
}
//將驗(yàn)證碼存入session
request.getSession().setAttribute("rand",rand);
// 將驗(yàn)證碼顯示到圖像中
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);
//隨機(jī)產(chǎn)生50個(gè)干擾點(diǎn),使圖像中的驗(yàn)證碼不已被其他程序探測(cè)到
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();//圖形生效
//輸出圖形到頁(yè)面
ImageIO.write(image, "JPEG", response.getOutputStream());
posted on 2012-05-30 18:32 Mr Lee 閱讀(544) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): java技術(shù)