web开发(四) 一次性验证码的代码实现
在網上看見一篇不錯的文章,寫的詳細。
以下內容引用那篇博文。轉載于《http://www.cnblogs.com/whgk/p/6426072.html》,在此僅供學習參考之用。
其實實現代碼的邏輯非常簡單,真的超級超級簡單。
1、在登錄頁面上login.jsp將驗證碼圖片使用標簽<img src="xxx">將繪制驗證碼圖片的url給它
2、在服務器端就兩個servlet,一個就是用來繪制驗證碼圖片的VerifyCodeServlet,另一個就是登錄時驗證驗證碼是否點寫正確或是否重復提交的LoginServlet
3、在VerifyCodeServlet中,將驗證碼的四個字母存入session中,然后在LoginServlet中,將請求中提交過來的驗證碼與session中的進行對比,如果正確,則驗證成功,并且將session中的驗證碼刪除,為什么要刪除?保證session中的數據只能被用一次,防止重復提交數據,如果不正確,就使用request,將錯誤信息保存,然后請求轉發到登錄頁面顯示錯誤信息,如果發現session中的數據為null,說明重復提交了數據,也將錯誤信息用同樣的方法返回到登錄頁面。
難點就在于:VerifyCodeServlet的代碼實現.對繪圖的代碼不是很熟悉。
login.jsp
<body>
<%
String msg = (String)request.getAttribute("msg");
if(msg != null){
out.print(msg);
}
%> <form action="/test01/LoginServlet" method="post">
用戶名:<input type="text" name="username" /> <br/>
驗證碼:<input type="text" name="verifyCode" size="5" /> <img src="/test01/VerifyCodeServlet" /> <br/>
<input type="submit" value="提交"/>
</form>
</body>
VerifyCodeServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //聲明驗證碼
int width = 60;
int height = 30;
String data = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz"; //隨機字符字典,其中0,o,1,I 等難辨別的字符最好不要
Random random = new Random();//隨機類
//1 創建圖片數據緩存區域(核心類)
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//創建一個彩色的圖片
//2 獲得畫板(圖片,ps圖層),繪畫對象。
Graphics g = image.getGraphics();
//3 選擇顏色,畫矩形3,4步是畫一個有內外邊框的效果
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
//4白色矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2); /**1 提供緩存區域,為了存放4個隨機字符,以便存入session */
StringBuilder builder = new StringBuilder(); //5 隨機生成4個字符
//設置字體顏色
g.setFont(new Font("宋體", Font.BOLD&Font.ITALIC, 20));
for(int i = 0 ; i < 4 ;i ++){
//隨機顏色
g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255))); //隨機字符
int index = random.nextInt(data.length());
String str = data.substring(index, index + 1); /**2 緩存*/
builder.append(str); //寫入
g.drawString(str, (width / 6) * (i + 1) , 20);
}
//給圖中繪制噪音點,讓圖片不那么好辨別
for(int j=0,n=random.nextInt(100);j<n;j++){
g.setColor(Color.RED);
g.fillRect(random.nextInt(width),random.nextInt(height),1,1);//隨機噪音點
} /**3 獲得隨機數據,并保存session*/
String tempStr = builder.toString();
request.getSession().setAttribute("sessionCacheData",tempStr); //.. 生成圖片發送到瀏覽器 --相當于下載
ImageIO.write(image, "jpg", response.getOutputStream());
}
LoginServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1 獲得用戶輸入的驗證碼
String verifyCode = request.getParameter("verifyCode");
//2 獲得服務器session 存放數據 ,如果沒有返回null
String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");
// *將服務器緩存session數據移除
request.getSession().removeAttribute("sessionCacheData");
// ** 判斷服務器是否存在
if(sessionCacheData == null){
request.setAttribute("msg", "請不要重復提交");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//3 比較
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用戶輸入錯誤
// * 存放request作用域
request.setAttribute("msg", "驗證碼輸入錯誤");
// * 請求轉發
request.getRequestDispatcher("/login.jsp").forward(request, response); return;
} //...... 登錄操作 } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
效果圖:
驗證碼錯誤時:
注意:
如果要拷貝代碼的話,需要改就應該就是那幾處url,你的肯定跟我的不一樣,并且有些人設置的servlet的訪問路徑也不一樣,所以拷貝的話只需要拷貝關鍵代碼即可。
總結
以上是生活随笔為你收集整理的web开发(四) 一次性验证码的代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hash算法和常见的hash函数 [转]
- 下一篇: sql left join、right