<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
    數據加載中……

    jsp生成隨機驗證碼


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

    : 動手體驗: 利用 Session 實現一次性驗證碼

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

    ?

    ????????????? // 設置瀏覽器不要緩存此圖片

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

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

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

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

    ????????????? // 創建內存圖象并獲得其圖形上下文

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

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

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

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

    ????????????? // 產生隨機的認證碼

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

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

    ????????????? // 產生圖像

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

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

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

    ????????????? // 結束圖像 的繪制 過程, 完成圖像

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

    ?

    ????????????? // 將當前驗證碼存入到 Session

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

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

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

    ????????????? // 隨機產生 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 中清除原來的驗證碼,

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

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

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

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

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

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

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

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

    ?????? }

    }

    ?


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

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

    ?????? <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 龔椿深 閱讀(4989) 評論(7)  編輯  收藏

    評論

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

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

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

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

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

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

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

    bdsb
    2013-10-24 18:06 |

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

    打發水電費
    2014-01-06 16:42 | 發撒旦

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

    呆呆呆呆呆呆
    2014-01-06 16:42 | 發撒旦

    # 123  回復  更多評論   

    12
    2015-08-16 22:41 | 11

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


    網站導航:
     
    主站蜘蛛池模板: 黄色网站软件app在线观看免费 | 国产麻豆一精品一AV一免费| 亚洲A∨午夜成人片精品网站| 伊人久久五月丁香综合中文亚洲| 91精品免费在线观看| 亚洲乱码卡三乱码新区| 无码中文字幕av免费放| 亚洲综合激情五月丁香六月| 国产免费毛不卡片| 亚洲老熟女五十路老熟女bbw| 日韩免费三级电影| 美女18一级毛片免费看| 三上悠亚亚洲一区高清| 国产成人精品一区二区三区免费| 91亚洲国产在人线播放午夜 | 黄色片网站在线免费观看| 亚洲国产精品无码久久九九| eeuss影院免费92242部| 亚洲AV无码成人精品区在线观看| 久久久久av无码免费网| 亚洲国产视频久久| 免费看小12萝裸体视频国产 | 一本岛高清v不卡免费一三区| 亚洲第一男人天堂| 亚洲高清无码在线观看| 午夜视频免费在线观看| 狠狠色伊人亚洲综合网站色| 亚洲A∨午夜成人片精品网站| 久久久免费的精品| 亚洲国产精品自在自线观看| 亚洲一区二区视频在线观看| 999久久久免费精品播放| 亚洲色最新高清av网站| 亚洲偷自拍拍综合网| 亚洲黄色免费在线观看| 国产大陆亚洲精品国产| 亚洲av无码成人黄网站在线观看| 欧美三级在线电影免费| 最近免费中文字幕中文高清| 亚洲无人区码一二三码区别图片| 亚洲愉拍99热成人精品热久久 |