<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

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


    網站導航:
     
    主站蜘蛛池模板: 香港一级毛片免费看| 午夜亚洲WWW湿好爽| 免费无码作爱视频| 亚洲精品无码永久在线观看你懂的| 黄色网址免费在线| 国产乱子伦精品免费无码专区| 国产成人人综合亚洲欧美丁香花 | 又黄又爽一线毛片免费观看 | 久久精品国产精品亚洲蜜月| 成人性生交大片免费看好| 亚洲精品无码乱码成人| 免费成人高清在线视频| 亚洲午夜久久影院| 无码专区永久免费AV网站| 亚洲AV成人精品日韩一区 | 国产片免费福利片永久| 男男gay做爽爽的视频免费| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 福利免费观看午夜体检区| jiz zz在亚洲| 午夜亚洲福利在线老司机| 一级做受视频免费是看美女| 亚洲av无码一区二区三区不卡| 在线看片免费人成视久网| 亚洲六月丁香六月婷婷蜜芽 | 亚洲性猛交XXXX| 亚洲一区免费视频| 亚洲Av永久无码精品一区二区| 亚洲免费视频一区二区三区| 嫩草在线视频www免费观看| 亚洲国产精品一区二区三区在线观看 | 亚洲乱人伦精品图片| 免费在线观看毛片| 一级毛片免费视频| 亚洲AV无码一区二区三区久久精品| 亚洲精品一级无码鲁丝片| 最刺激黄a大片免费网站| 无套内射无矿码免费看黄| 亚洲网站在线免费观看| 日韩精品电影一区亚洲|