效果
JSP代碼
<div class="inputbox">
<label for="mima">驗證碼:</label>
<input id="confirm" type="text" name="confirm" placeholder=" " required style="width:35px"/>
<img src="/MarkSystem/ImagServlet" onclick="changeImage();" id="pp"/>
<a href="#" onclick="changeImage();">看不清</a>
<span style="color: red">
${request.getAttribute("message")}<!--提示驗證碼輸入錯誤 -->
</span>
</div>
Servlet代碼
package com.yang.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 負責生成一個隨機的驗證碼圖片
*/
@WebServlet("/ImagServlet")
public class ImagServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//負責生成一個驗證碼
int width=75;
int height=25;
//需要一個畫圖工具類
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//畫筆
Graphics g = bi.getGraphics();
//給畫布填充顏色,白色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
//繪製外邊框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width-1, height-1);
// 生成隨機驗證碼 大小字母和數字 62
char[] array = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; // 62
//常用中文字庫
String str = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66";
StringBuffer sb = new StringBuffer();
Random r = new Random();
for (int i = 1; i <= 4; i++) {
int index = r.nextInt(62); // 0-61
String c = array[index] + "";
Font f = new Font("Arial", Font.BOLD, 16);// 字體樣式
g.setFont(f);
// 0-255
int red = r.nextInt(256);
int green = r.nextInt(256);
int blue = r.nextInt(256);
Color color = new Color(red, green, blue); // 隨機色
g.setColor(color);
g.drawString(c, (65 / 5) * i, 20); // 向圖片上挨個寫字
sb.append(c);
}
//把系統生成的驗證碼存一下session,一會兒需要驗證
HttpSession session = request.getSession();
session.setAttribute("systemcode", sb.toString());
System.out.println("系統生成的驗證碼:"+sb.toString());
// 繪製干擾線
for (int i = 1; i <= 8; i++) {
int red = r.nextInt(256);
int green = r.nextInt(256);
int blue = r.nextInt(256);
Color color = new Color(red, green, blue); // 隨機色
g.setColor(color);
int x1 = r.nextInt(width);
int y1 = r.nextInt(height);
int x2 = r.nextInt(width);
int y2 = r.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
// 輸出圖片
response.setContentType("image/jpeg"); // 設置圖片格式
ServletOutputStream out = response.getOutputStream();// 字節輸出流
ImageIO.write(bi, "jpeg", out);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
登錄的Servlet檢驗驗證碼的正確性
String usercode = request.getParameter("confirm");//用戶輸入的驗證碼
String systemcode = (String)session.getAttribute("systemcode");//系統生成的驗證碼
User u = new User(username, password);
if(usercode.equalsIgnoreCase(systemcode)) {
User user = us.login(u);
if(user!=null) {
//登錄成功,存儲session,跳轉首頁
session.setAttribute("userid", user);
//跳轉
response.getWriter().println("<script>location.href='index.jsp'</script>");
}else {
//登錄失敗,跳轉到登錄界面
request.setAttribute("message", "賬號或密碼錯誤!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}else {
//驗證碼錯誤
request.setAttribute("message", "驗證碼錯誤!");
//必須轉發
request.getRequestDispatcher("login.jsp").forward(request, response);
}