模擬使用者登入,內含驗證碼驗證和request等操作

ben跑的換行符發表於2019-07-21

模擬使用者登入,內含驗證碼驗證和jsp等操作


1.案例需求:

    1. 訪問帶有驗證碼的登入頁面login.jsp
    2. 使用者輸入使用者名稱,密碼以及驗證碼。
        * 如果使用者名稱和密碼輸入有誤,跳轉登入頁面,提示:使用者名稱或密碼錯誤
        * 如果驗證碼輸入有誤,跳轉登入頁面,提示:驗證碼錯誤
        * 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:使用者名稱,歡迎您

2.案例分析:

模擬使用者登入,內含驗證碼驗證和request等操作

3.程式碼實現

1. 登入介面的設定:

設計思想:
1. 先寫出頁面的基本框架:一個基本的表單,其中採用el表示式來表達虛擬目錄,動態生成虛擬目錄。

<form action="${pageContext.request.contextPath}/loginServlet" method="post">
    <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>驗證碼</td>
            <td><input type="text" name="checkCode"></td>
        </tr>
        <tr>

            <td colspan="2"><img id="img" src="/day16/checkCodeServlet"></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="登入"></td>
        </tr>
    </table>


</form>


2. 用於顯示驗證碼正確和錯誤之後的定向問題:主要codes:

採用el表示式是用來顯示的,如果沒有返回值或者返回值為空的話,如果採用request.getAttribute()的方法會產生null,但是如果採用el表示式,直接返回空字串,不用返回null,簡化了程式碼。
<div>
    ${requestScope.cc_error}  
/*這裡也可以採用三目操作符來表示:
    <%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%>   */
</div>
<div>
    ${requestScope.login_error}
</div>

2. 獲取驗證碼的設定:

使用servlet來獲取驗證碼,具體過程如下:
1. 先建立一個物件,用來畫圖:

    int width=100;
    int height=50;
    BufferedImage image=new BufferedImage(width,height,
                BufferedImage.TYPE_INT_RGB);
解釋:第1,2行程式碼不用解釋。使用BufferdImage物件來創造一個影象的物件,剛開始顯示一個小方框,長100px,寬50px,採用RGB來塗色
2. 進一步美化照片,先填充色來填充背景
    Graphics graphics = image.getGraphics();
    graphics.setColor(Color.PINK);//
    graphics.fillRect(0,0,width,height);
3. 到這一步,會發現下和右沒有圖上顏色,再進一步梅花:
    graphics.setColor(Color.blue);
    graphics.drawRect(0,0,width-1,height-1);
4. 定義顯示在圖片上的字元和數字的庫---》由大寫A~Z小寫的a~z和0~9組成: 
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
5. 建立隨機類來生成隨機的角標
    Random ran=new Random();
    StringBuilder sb=new StringBuilder();
    for (int i = 1; i <=4 ; i++) {
            int index = ran.nextInt(str.length());
            //獲取字元
            char ch = str.charAt(index);
            sb.append(ch);
            //2.3寫驗證碼
            graphics.drawString(ch+"",width/5*i,height/2);
        }
6. 再將生成的動態驗證碼字串交個session來儲存,共客戶端訪問資料
    String checkCode_session = sb.toString();
    //存入session
    request.getSession().setAttribute("checkCode_session",checkCode_session);
7. 生產干擾線
    graphics.setColor(Color.GREEN);
    //隨機生成座標
    for (int i = 0; i < 10; i++) {
        int x1 = ran.nextInt(width);
        int x2 = ran.nextInt(width);
        int y1 = ran.nextInt(height);
        int y2 = ran.nextInt(height);
        graphics.drawLine(x1,x2,y1,y2);

    }
8. 將圖片輸出到頁面展示
    ImageIO.write(image,"jpg",response.getOutputStream());

至此,驗證碼的servlet生成;

3. 登入servlet的設定:

TIP:這裡採用寫死的方法,簡化了開發,讀者可以採用sql的資料庫連線上去動態生成使用者名稱和密碼。

1. 首先設定程式碼的編碼格式為utf-8;
**request.setCharacterEncoding("utf-8");**
注意是request,請求用來設定編碼。response一般是用來伺服器的傳送資訊(用於給客戶端傳送迴應)
2.採用request請求來獲取username,password和驗證碼的元素:

    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String checkCode = request.getParameter("checkCode");
3. 獲取session進行驗證:
HttpSession session = request.getSession();
String checkCode_session = (String) session.getAttribute("checkCode_session");
//刪除驗證碼session中儲存的
session.removeAttribute("checkCode_session");
4. 判斷驗證碼,使用者名稱和密碼是否都正確,首先需要先判斷驗證碼是否正確,這樣可以避免資料庫的消耗。(如果先驗證使用者名稱和密碼的話,需要去資料庫查詢,查詢完了如果驗證碼不對,也無法登入,所以需要先驗證驗證碼)

判斷獲取的字串是否為空然後和在login.jsp頁面中輸入的字串去掉大小寫進行比較
如圖在login.jsp中定義的:

模擬使用者登入,內含驗證碼驗證和request等操作
這是在CheckCodeServlet中儲存在session中的驗證碼字串
模擬使用者登入,內含驗證碼驗證和request等操作

String checkCode = request.getParameter("checkCode");
表示把資料從請求中去了出來並且賦給了checkCode。

模擬使用者登入,內含驗證碼驗證和request等操作

進行比較
if(checkCode_session!=null&&checkCode_session.equalsIgnoreCase(checkCode)){
        //忽略大小寫比較字串,判斷使用者名稱和密碼是否一致
        //正確
        if("zhangsan".equals(username)&&"123".equals(password)){
            //登入成功
            //儲存資訊,使用者資訊
                session.setAttribute("user",username);
            //重定向到success.jsp
            response.sendRedirect(request.getContextPath()+"/success.jsp");
        }else{
            //不一致,儲存提示資訊到request
            request.setAttribute("login_error","使用者名稱或者密碼錯誤");
            //轉發到登入頁面
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }else{
        //不一致,儲存提示資訊到request
        request.setAttribute("cc_error","驗證碼錯誤");
        //轉發到登入頁面
        request.getRequestDispatcher("/login.jsp").forward(request,response);
    }

3.介面如下:

模擬使用者登入,內含驗證碼驗證和request等操作

##4.測試用例:略

codes from GitHub-----》》》》》登入簡單案例-驗證碼

相關文章