1. 程式人生 > >帶用驗證碼功能的用戶登錄 -學習筆記

帶用驗證碼功能的用戶登錄 -學習筆記

帶用驗證碼功能的用戶登錄 -學習筆記

  • )驗證碼使用一個CheckCodeSerlvet產生,通過<img src=""/>發送請求,將驗證碼綁定到HttpSession中
  • )產生的驗證碼一定要在輸出到瀏覽器之前綁定到HttpSession中
  • )設置驗證碼禁止緩存要在輸出到瀏覽器之前
  • )所有響應頭的設置放置在最先
  • java代碼

    LoginServlet

    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.zip.Checksum;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginServlet extends HttpServlet {
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            // 收集客戶端填入的驗證碼
            String checkCodeClient = request.getParameter("checkCodeClient");
    
            // 取得服務端填入的驗證碼
            String checkCodeServer = (String) request.getSession().getAttribute(
                    "checkCodeServer");
            // 設置字體
            response.setContentType("text/html;charset=UTF-8");
            //判斷的。通過客戶端與服務端
            if (checkCodeClient != null && checkCodeClient.trim().length() > 0
                    && checkCodeServer != null
                    && checkCodeServer.equals(checkCodeClient)) {
                response.getWriter().write("驗證碼正確");
    
            } else {
                response.getWriter().write("驗證碼出錯");
            }
    
        }
    
    }

    CheckCodeServlet

    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class CheckCodeServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //緩存
            response.setHeader("expires","-1");
            response.setHeader("cache-control","no-cache");  //沒有緩成
            response.setHeader("pragma","no-cache");
            String token = Token.getNum();
            //將驗證碼綁定到域對象
            HttpSession session = request.getSession();
            session.setAttribute("checkCodeServer",token);
            //在內存生存一個圖片
            BufferedImage image = new BufferedImage(50,25,BufferedImage.TYPE_INT_RGB);
    
            //獲取畫筆
            Graphics g = image.getGraphics();
            //設置大小
            g.drawString(token,15,15);
    
            //增加幹擾線
            for(int i=0;i<10;i++)
            {
                Random r = new Random();
                int x1 = r.nextInt(50);
                int y1 = r.nextInt(25);
                g.drawLine(x1, y1, x1+4,y1+4);
            }
    
            //寫到瀏覽器
            ImageIO.write(image,"JPG",response.getOutputStream());
    
        }
    
    }
    
    //用於產生隨機數
    class Token{
        public static String getNum(){
            Random r = new Random();
            int num = r.nextInt(10000);
            return num + "";
        }
    }

    html代碼

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>login.html</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      </head>
      <body>
        <form action="/day04/LoginServlet" method="post">
            <table border="1" align="center">
            <caption>用戶登陸驗證碼</caption>
                <tr>
                    <th>用戶名</th>
                    <td><input type="text" name="username"/></td>
                </tr>
                <tr>
                    <th>密碼</th>
                    <td><input type="password" name="password"/></td>
                </tr>
                <tr>
                    <th>驗證碼</th>
                    <td>
                        <input type="text" name="checkCodeClient"/>
                    </td>
                    <td>
                        <img src="/day04/CheckCodeServlet"/>    
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" value="提交"/>
                    </td>
                </tr>
            </table>
        </form>
      </body>
    </html>
    

    頁面顯示:
    技術分享圖片

    帶用驗證碼功能的用戶登錄 -學習筆記