<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java,J2EE,Weblogic,Oracle

    java項目隨筆
    隨筆 - 90, 文章 - 6, 評論 - 61, 引用 - 0
    數(shù)據(jù)加載中……

    jsp生成隨機驗證碼


    服務(wù)器程序接收到表單數(shù)據(jù)后,首先判斷用戶是否填寫了正確的驗證碼,只有該驗證碼與服務(wù)器端保存的驗證碼匹配時,服務(wù)器程序才開始正常的表單處理流程。驗證碼使用一次即失效,
    用戶只能重新向服務(wù)器發(fā)出訪問表單填寫頁面的請求來獲得新的驗證碼,并填寫新的驗證碼后才能再次提交有效的表單請求, 這樣將大大 增加了用戶重復(fù)操作的難度。密碼猜測工具要逐一嘗試每個密碼的前題條件是先輸入正確的驗證碼,而驗證碼是一次性有效的,這樣基本上就阻斷了密碼猜測工具的自動地處理過程
    下面編寫一個利用
    Session 實現(xiàn)一次性驗證碼的例子程序,整個程序包含 三個組件: check_code.html CheckCodeServlet.java LogonFormServlet.java check_code.html 是引用驗證碼圖片的 FORM 表單頁面, CheckCodeServlet.java 是用于產(chǎn)生帶有隨機驗證碼圖片的 Servlet 程序, LogonFormServlet.java 則是負責(zé)處理 FORM 表單請求的 Servlet 程序。

    : 動手體驗: 利用 Session 實現(xiàn)一次性驗證碼

    1 按上面描述的功能編寫如 例程7-11、例程7-12和例程7-13所示的 程序。

    例程7-11 ? check_code.html

    ?


    <h3> 帶有驗證碼的登錄頁面</h3>

    <form action="servlet/LogonFormServlet" method="post">

    用戶名:<input type="text" name="name"><br>

    密 碼:<input type="password" name="pass"><br>

    驗證碼:<input type="text" name="check_code">

    <img src="servlet/CheckCodeServlet"><br>

    <input type="submit" value=" 登錄">

    </form>

    ?


    例程7-12 ? 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 HEIGHT = 20;

    ?????? public void doGet(HttpServletRequest request,HttpServletResponse response)

    ???????????????????? throws ServletException,IOException

    ?????? {???????????

    ????????????? HttpSession session = request.getSession();

    ????????????? response.setContentType("image/jpeg");

    ????????????? ServletOutputStream sos = response.getOutputStream();

    ?

    ????????????? // 設(shè)置瀏覽器不要緩存此圖片

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

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

    ????????????? response.setDateHeader("Expires", 0);

    ?????????????

    ????????????? // 創(chuàng)建內(nèi)存圖象并獲得其圖形上下文

    ????????????? BufferedImage image =

    ???????????????????? new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

    ????????????? Graphics g = image.getGraphics();

    ?????????????

    ????????????? // 產(chǎn)生隨機的認證碼

    ????????????? char [] rands = generateCheckCode();

    ?????????????

    ????????????? // 產(chǎn)生圖像

    ????????????? drawBackground(g);

    ????????????? drawRands(g,rands);

    ?????????????

    ????????????? // 結(jié)束圖像 的繪制 過程, 完成圖像

    ????????????? g.dispose();

    ?????????????

    ?????????????
    ????????????????? //
    將圖像輸出到客戶端

    ????????????? ByteArrayOutputStream bos = new ByteArrayOutputStream();

    ????????????? ImageIO.write(image, "JPEG", bos);

    ????????????? byte [] buf = bos.toByteArray();

    ????????????? response.setContentLength(buf.length);

    ????????????? // 下面的語句也可寫成: bos.writeTo(sos);

    ????????????? sos.write(buf);

    ????????????? bos.close();

    ????????????? sos.close();

    ?

    ????????????? // 將當(dāng)前驗證碼存入到 Session

    ????????????? session.setAttribute("check_code",new String(rands));

    ????????????? // 直接使用下面的代碼將有問題, Session 對象必須在提交響應(yīng)前獲得

    ????????????? //request.getSession().setAttribute("check_code",new String(rands));

    ?????? }

    ??????

    ?????? private char [] generateCheckCode()

    ?????? {

    ????????????? // 定義驗證碼的字符表

    ????????????? String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

    ????????????? 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));

    ????????????? // 在不同的高度上輸出驗證碼的每個字符 ????????

    ????????????? g.drawString("" + rands[0],1,17);

    ????????????? g.drawString("" + rands[1],16,15);

    ????????????? g.drawString("" + rands[2],31,18);

    ????????????? g.drawString("" + rands[3],46,16);

    ????????????? System.out.println(rands);

    ?????? }

    ??????

    ?????? private void drawBackground(Graphics g)

    ?????? {

    ???????????? // 畫背景

    ????????????? g.setColor(new Color(0xDCDCDC));

    ????????????? g.fillRect(0, 0, WIDTH, HEIGHT);

    ????????????? // 隨機產(chǎn)生 120 個干擾點

    ????????????? for(int i=0; i<120; i++)

    ????????????? {

    ???????????????????? int x = (int)(Math.random() * WIDTH);

    ???????????????????? int y = (int)(Math.random() * HEIGHT);

    ???????????????????? int red = (int)(Math.random() * 255);

    ???????????????????? int green = (int)(Math.random() * 255);

    ???????????????????? int blue = (int)(Math.random() * 255);

    ???????????????????? g.setColor(new Color(red,green,blue));???????

    ???????????????????? g.drawOval(x,y,1,0);

    ????????????? }

    ?????? }

    }

    ?


    例程 7-13 ? LogonFormServlet .java

    ?


    import java.io.*;

    import javax.servlet.*;

    import javax.servlet.http.*;

    ?

    public class LogonFormServlet extends HttpServlet

    {

    ?????? public void service(HttpServletRequest request,

    ????????????? HttpServletResponse response) throws ServletException, IOException

    ?????? {

    ????????????? response.setContentType("text/html;charset=GB2312");?????????????????????????

    ????????????? PrintWriter out = response.getWriter();

    ?????????????

    ????????????? HttpSession session = request.getSession(false);

    ????????????? if(session == null)

    ????????????? {

    ???????????????????? out.println(" 驗證碼處理問題 !");

    ???????????????????? return;

    ????????????? }

    ?????????????

    ????????????? String savedCode = (String)session.getAttribute("check_code");

    ????????????? if(savedCode == null)

    ????????????? {

    ???????????????????? out.println(" 驗證碼處理問題 !");

    ???????????????????? return;

    ????????????? }

    ???????????????????????????

    ????????????? String checkCode = request.getParameter("check_code");

    ????????????? if(!savedCode.equals(checkCode))

    ????????????? {

    ???????????????????? /* 驗證碼未通過,不從 Session 中清除原來的驗證碼,

    ???????????????????? 以便用戶可以后退回登錄頁面繼續(xù)使用原來的驗證碼進行登錄 */

    ???????????????????? out.println(" 驗證碼無效 !");

    ???????????????????? return;

    ????????????? }

    ????????????? /* 驗證碼檢查通過后,從 Session 中清除原來的驗證碼,

    ????????????? 以防用戶后退回登錄頁面繼續(xù)使用原來的驗證碼進行登錄 */

    ????????????? session.removeAttribute("check_code");

    ????????????? out.println(" 驗證碼通過,服務(wù)器正在校驗用戶名和密碼 !");

    ?????? }

    }

    ?


    編譯上面的兩個 Java 文件,確保編譯后生成的class文件存放在了 < tomcat 安裝目錄 >\webapps\it315\WEB-INF\classes 目錄中。將 check_code.html 文件保存在 < tomcat 安裝目錄 > \webapps\it315 目錄中。

    2 )在 < tomcat 安裝目錄 > \webapps\it315\WEB-INF\web.xml 文件中注冊有關(guān)的Servlet,并設(shè)置其映射URL。在web.xml文件中的相應(yīng)位置處增加如下兩段內(nèi)容:

    ?????? <servlet>

    ????????????? <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>

    ????????????? <servlet-name>CheckCodeServlet</servlet-name>

    ????????????? <url-pattern>/servlet/CheckCodeServlet</url-pattern>

    ?????? </servlet-mapping>

    ?????? <servlet-mapping>

    ????????????? <servlet-name>LogonFormServlet</servlet-name>

    ????????????? <url-pattern>/servlet/LogonFormServlet</url-pattern>

    ?????? </servlet-mapping>?????????????????

    保存 web.xml 文件后,重新啟動 Tomcat

    3 )在瀏覽器地址欄中輸入如下地址:

    ?????? http://localhost:8080/it315/check_code.html

    瀏覽器中顯示出如圖 7.25 所示的效果 ,然后就可以對驗證碼的功能進行測試了。

    posted on 2006-11-20 16:15 龔椿深 閱讀(4991) 評論(7)  編輯  收藏

    評論

    # re: jsp生成隨機驗證碼  回復(fù)  更多評論   

    ;sad;flsadkfdsf
    2007-12-17 21:00 | xiao

    # re: jsp生成隨機驗證碼  回復(fù)  更多評論   

    外兒童歌溫柔我⑤他5熱 人
    2009-05-21 21:57 | 澀容易會突然

    # re: jsp生成隨機驗證碼[未登錄]  回復(fù)  更多評論   

    驗證碼顯示不出來咯
    2010-06-21 17:18 | yy

    # re: jsp生成隨機驗證碼[未登錄]  回復(fù)  更多評論   

    bdsb
    2013-10-24 18:06 |

    # re: jsp生成隨機驗證碼  回復(fù)  更多評論   

    打發(fā)水電費
    2014-01-06 16:42 | 發(fā)撒旦

    # re: jsp生成隨機驗證碼  回復(fù)  更多評論   

    呆呆呆呆呆呆
    2014-01-06 16:42 | 發(fā)撒旦

    # 123  回復(fù)  更多評論   

    12
    2015-08-16 22:41 | 11

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本午夜免费福利视频| 67pao强力打造67194在线午夜亚洲 | 亚洲乱理伦片在线观看中字| 国产亚洲精品线观看动态图| 在线观看免费人成视频色9| 99久久婷婷免费国产综合精品| 亚洲人成电影网站色| 国产亚洲精品美女久久久久 | xvideos永久免费入口| 亚洲爆乳无码专区www| 亚洲人成综合网站7777香蕉| 久久青草亚洲AV无码麻豆| 国产福利电影一区二区三区,亚洲国模精品一区 | 免费成人高清在线视频| 免费国产在线精品一区| 亚洲成aⅴ人片久青草影院按摩| 成年大片免费视频播放一级| 搜日本一区二区三区免费高清视频 | 在线综合亚洲中文精品| 久久亚洲私人国产精品vA| 亚洲宅男天堂在线观看无病毒| 免费a级毛片大学生免费观看 | 国产免费看插插插视频| 国产yw855.c免费视频| 亚洲精品制服丝袜四区| 亚洲av之男人的天堂网站| 亚洲已满18点击进入在线观看| 一级毛片在线免费视频| 成人免费的性色视频| 又大又硬又爽又粗又快的视频免费| 日本免费中文字幕| 日韩免费无码视频一区二区三区| 久久久久国产精品免费免费不卡 | a一级爱做片免费| 两个人日本WWW免费版| 久久免费精品视频| 免费无遮挡无码视频网站| 国产精品美女自在线观看免费| 少妇亚洲免费精品| 亚洲精品专区在线观看| 亚洲国产一成人久久精品|