模擬使用者登入,內含驗證碼驗證和jsp等操作
1.案例需求:
1. 訪問帶有驗證碼的登入頁面login.jsp
2. 使用者輸入使用者名稱,密碼以及驗證碼。
* 如果使用者名稱和密碼輸入有誤,跳轉登入頁面,提示:使用者名稱或密碼錯誤
* 如果驗證碼輸入有誤,跳轉登入頁面,提示:驗證碼錯誤
* 如果全部輸入正確,則跳轉到主頁success.jsp,顯示:使用者名稱,歡迎您
2.案例分析:
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中定義的:
這是在CheckCodeServlet中儲存在session中的驗證碼字串
String checkCode = request.getParameter("checkCode");
表示把資料從請求中去了出來並且賦給了checkCode。
進行比較
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.介面如下:
##4.測試用例:略
codes from GitHub-----》》》》》登入簡單案例-驗證碼