需求:
1. 訪問帶有驗證碼的登錄頁面login.jsp
2. 用戶輸入用戶名,密碼以及驗證碼。
* 如果用戶名和密碼輸入有誤,跳轉登錄頁面,提示:用戶名或密碼錯誤
* 如果驗證碼輸入有誤,跳轉登錄頁面,提示:驗證碼錯誤
* 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:用戶名,歡迎您
login.jsp頁面代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>login</title> <script>
/* 分析: 點擊圖片,需要換一張 1.給圖片綁定單擊事件 2.重新設置圖片的src屬性值 */
window.onload = function(){
document.getElementById("img").onclick = function(){
this.src="/yanzhengma_war_exploded/checkCodeServlet?time="+new Date().getTime();
}
}
</script>
<style> div{ color: red; } </style> </head> <body> <form action="/yanzhengma_war_exploded/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="/yanzhengma_war_exploded/checkCodeServlet"></td> </tr> <tr> <td colspan="2"><input type="submit" value="登錄"></td> </tr> </table> </form>
<div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div> <div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div> </body> </html>
生成驗證碼的代碼:
@WebServlet("/checkCodeServlet") public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置驗證碼框的寬、高 int width = 100; int height = 50; //1.創建一對象,在內存中圖片(驗證碼圖片對象) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2.美化圖片 //2.1 填充背景色 Graphics g = image.getGraphics();//畫筆對象 g.setColor(Color.PINK);//設置畫筆顏色 g.fillRect(0,0,width,height); //2.2畫邊框 g.setColor(Color.BLUE); //寬高不減一,會有一半的邊框樣式體現不出來 g.drawRect(0,0,width - 1,height - 1); String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789"; //生成隨機角標 Random ran = new Random(); StringBuilder sb = new StringBuilder(); //驗證碼有4個數,故循環四次 for (int i = 1; i <= 4; i++) { int index = ran.nextInt(str.length()); //獲取字符 char ch = str.charAt(index);//隨機字符 sb.append(ch); //2.3寫驗證碼 g.drawString(ch+"",width/5*i,height/2); } String checkCode_session = sb.toString(); //將驗證碼存入session request.getSession().setAttribute("checkCode_session",checkCode_session); //2.4畫干擾線 g.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); //兩點確定一線,點(x1,y1)到點(x2,y2)形成一條線 g.drawLine(x1,y1,x2,y2); } //3.將圖片輸出到頁面展示 ImageIO.write(image,"jpg",response.getOutputStream());
loginServlet代碼:(用戶的登錄涉及到數據庫的操作,此處將DAO省去,簡化編寫 )
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.設置request編碼 request.setCharacterEncoding("utf-8"); //2.獲取參數 String username = request.getParameter("username"); String password = request.getParameter("password"); String checkCode = request.getParameter("checkCode"); //3.先獲取生成的驗證碼 HttpSession session = request.getSession(); String checkCode_session = (String) session.getAttribute("checkCode_session"); //刪除session中存儲的驗證碼,為了防止返回登陸頁面后原驗證碼依舊可用 session.removeAttribute("checkCode_session"); //3.先判斷驗證碼是否正確 if(checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){ //忽略大小寫比較 //驗證碼正確 //判斷用戶名和密碼是否一致 if("zhangsan".equals(username) && "123".equals(password)){//需要調用UserDao查詢數據庫 //登錄成功 //存儲信息,用戶信息 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); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
success.jsp頁面代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h1><%=request.getSession().getAttribute("user")%>,歡迎您</h1> </body> </html>