需求:
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>

