帶用驗證碼功能的用戶登錄 -學習筆記
阿新 • • 發佈:2018-04-18
帶用驗證碼功能的用戶登錄 -學習筆記)驗證碼使用一個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>
頁面顯示:
帶用驗證碼功能的用戶登錄 -學習筆記