|
注,本代碼引用來(lái)之張孝祥的最新力作<深入體驗(yàn)java web開(kāi)發(fā)內(nèi)幕-核心基礎(chǔ)>,保留所有權(quán)利。 此段servlet完整展示了動(dòng)態(tài)驗(yàn)證碼的生成過(guò)程,通俗易懂,不愧為張老師所寫(xiě)的代碼,在此遇到一個(gè)問(wèn)題,就是常說(shuō)的javax.servlet包無(wú)法引入,我按要求都把servlet包放入了lib目錄中,可還是一樣找不到,因此實(shí)際調(diào)試效果還沒(méi)看到。 首先是一個(gè)簡(jiǎn)單的登錄頁(yè)面。 Check_login.htm <html> <head> <title>實(shí)現(xiàn)驗(yàn)證碼功能</title> </head> <body> <h1>帶有驗(yàn)證碼功能的登錄演示</h1> <form action="LogonFormServlet"> <table> <tr> <td>用戶名:</td> <td><input type="text" name="userName"></td> </tr> <tr> <td>密碼:</td> <td><input type="password" name="password"></td> </tr> <tr> <td>驗(yàn)證碼:</td> <td><input type="text" value="mildo" name="passport"><img src="CheckCodeServlet"></td> </tr> <tr colspan="2"> <td><input type="submit" value="登錄"></td> </tr> </table> </form> </body> </html>接下來(lái)就是生成圖片驗(yàn)證碼的Servlet了,源代碼: CheckCodeServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.awt.*; import java.awt.image.*; import javax.imageio.ImageIO;![]() public class CheckCodeServlet extends HttpServlet![]() ...{ private static int WIDTH=60; private static int HIGHT=20; public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ![]() ...{ HttpSession session = Request.session(); response.setContent("image/jpeg"); ServletOutputStream sos = response.getOutputStream(); //設(shè)置瀏覽器不要緩存圖片 response.setHead("Pragma","No-cache"); response.setHead("Cache-Control","no-cache"); response.setDateHead("Expires",0); //創(chuàng)建內(nèi)建圖像,并獲得上下文 BufferedImage image = new BufferedImage(WIDTH,HIGHT,BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); //生成隨機(jī)認(rèn)證碼 char [] rands = new generateCheckCode(); //產(chǎn)生圖像 drawBackgrounds(g); drawRands(g,rands); //結(jié)束圖像繪制,完成輸出 g.dispose(); //輸出到客戶端 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image,"jpeg",bos); byte [] buf = bos.toByteArray(); response.setContentLength(buf.length); //下面的語(yǔ)句也可以寫(xiě)成 bos.write(sos); sos.wirte(buf); bos.close(); sos.close(); //將當(dāng)前驗(yàn)證碼插入到session中 session.setAttribute("check_code",new String(rands)); } private char[] generateCheckCode()![]() ...{ //定義驗(yàn)證碼的字符集 String str = "0123456789abcdefghjklmnopqrstuvwxyz"; char [] rands = new char[4]; for(int i=0;i<4;i++)![]() ...{ int rand = (int)(Math.random()*36); rands[i] = chars.charAt(rand); } return rands; } private void drawRands(Graphics g,char[] rands)![]() ...{ g.setColor(Color.black); g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18)); //在不同的高度輸出驗(yàn)證碼的字符 g.drawString(""+rands[0],1,16); g.drawString(""+rands[1],16,18); g.drawString(""+rands[2],32,15); g.drawString(""+rands[3],51,17); System.out.println(rands); } private void drawBackground(Graphics g)![]() ...{ //畫(huà)背景 g.setColor(Color.cyan); g.fillRect(0,0,WIDTH,HIGHT); //添加隨機(jī)120個(gè)雜點(diǎn) for(int i=0;i<120;i++)![]() ...{ int x = (int)(Math.random()*WIDTH); int y = (int)(Math.random()*HIGHT); int red = (int)(Math.random()*255); int blue = (int)(Math.random()*255); int green = (int)(Math.random()*255); g.setColor(new Color(red,green,blue)); g.drawOval(x,y,1,0); } } }用來(lái)驗(yàn)證的servlet代碼: LogonFormServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.awt.*; import java.awt.image.*; import javax.imageio.ImageIO;![]() public class CheckCodeServlet extends HttpServlet![]() ...{ private static int WIDTH=60; private static int HIGHT=20; public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ![]() ...{ HttpSession session = Request.session(); response.setContent("image/jpeg"); ServletOutputStream sos = response.getOutputStream(); //設(shè)置瀏覽器不要緩存圖片 response.setHead("Pragma","No-cache"); response.setHead("Cache-Control","no-cache"); response.setDateHead("Expires",0); //創(chuàng)建內(nèi)建圖像,并獲得上下文 BufferedImage image = new BufferedImage(WIDTH,HIGHT,BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); //生成隨機(jī)認(rèn)證碼 char [] rands = new generateCheckCode(); //產(chǎn)生圖像 drawBackgrounds(g); drawRands(g,rands); //結(jié)束圖像繪制,完成輸出 g.dispose(); //輸出到客戶端 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image,"jpeg",bos); byte [] buf = bos.toByteArray(); response.setContentLength(buf.length); //下面的語(yǔ)句也可以寫(xiě)成 bos.write(sos); sos.wirte(buf); bos.close(); sos.close(); //將當(dāng)前驗(yàn)證碼插入到session中 session.setAttribute("check_code",new String(rands)); } private char[] generateCheckCode()![]() ...{ //定義驗(yàn)證碼的字符集 String str = "0123456789abcdefghjklmnopqrstuvwxyz"; char [] rands = new char[4]; for(int i=0;i<4;i++)![]() ...{ int rand = (int)(Math.random()*36); rands[i] = chars.charAt(rand); } return rands; } private void drawRands(Graphics g,char[] rands)![]() ...{ g.setColor(Color.black); g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18)); //在不同的高度輸出驗(yàn)證碼的字符 g.drawString(""+rands[0],1,16); g.drawString(""+rands[1],16,18); g.drawString(""+rands[2],32,15); g.drawString(""+rands[3],51,17); System.out.println(rands); } private void drawBackground(Graphics g)![]() ...{ //畫(huà)背景 g.setColor(Color.cyan); g.fillRect(0,0,WIDTH,HIGHT); //添加隨機(jī)120個(gè)雜點(diǎn) for(int i=0;i<120;i++)![]() ...{ int x = (int)(Math.random()*WIDTH); int y = (int)(Math.random()*HIGHT); int red = (int)(Math.random()*255); int blue = (int)(Math.random()*255); int green = (int)(Math.random()*255); g.setColor(new Color(red,green,blue)); g.drawOval(x,y,1,0); } } }這些做好了,當(dāng)然要對(duì)servlet進(jìn)行注冊(cè)和映射了,web.xml <servlet-name>CheckCodeServlet</servlet-name> <servlet-class>CheckCodeServlet</servlet-class> </servlet>![]() <servlet> <servlet-name>LogonFormServlet</servlet-name> <servlet-class>LogonFormServlet</servlet-class> </servlet>![]() <servlet-mapping> <serlet-name>CheckCodeServlet</serlet-name> <url-pattern>/CheckCodeServlet</url-pattern> </servlet-mapping> <servlet-mapping> <serlet-name>LogonFormServlet</serlet-name> <url-pattern>/LogonFormServlet</url-pattern> </servlet-mapping> |
|
|
來(lái)自: ShangShujie > 《java》