日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

web开发(四) 一次性验证码的代码实现

發(fā)布時間:2023/10/11 综合教程 205 老码农
生活随笔 收集整理的這篇文章主要介紹了 web开发(四) 一次性验证码的代码实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在網(wǎng)上看見一篇不錯的文章,寫的詳細(xì)。

以下內(nèi)容引用那篇博文。轉(zhuǎn)載于《http://www.cnblogs.com/whgk/p/6426072.html》,在此僅供學(xué)習(xí)參考之用。

其實實現(xiàn)代碼的邏輯非常簡單,真的超級超級簡單。

     1、在登錄頁面上login.jsp將驗證碼圖片使用標(biāo)簽<img src="xxx">將繪制驗證碼圖片的url給它

     2、在服務(wù)器端就兩個servlet,一個就是用來繪制驗證碼圖片的VerifyCodeServlet,另一個就是登錄時驗證驗證碼是否點寫正確或是否重復(fù)提交的LoginServlet

     3、在VerifyCodeServlet中,將驗證碼的四個字母存入session中,然后在LoginServlet中,將請求中提交過來的驗證碼與session中的進(jìn)行對比,如果正確,則驗證成功,并且將session中的驗證碼刪除,為什么要刪除?保證session中的數(shù)據(jù)只能被用一次,防止重復(fù)提交數(shù)據(jù),如果不正確,就使用request,將錯誤信息保存,然后請求轉(zhuǎn)發(fā)到登錄頁面顯示錯誤信息,如果發(fā)現(xiàn)session中的數(shù)據(jù)為null,說明重復(fù)提交了數(shù)據(jù),也將錯誤信息用同樣的方法返回到登錄頁面。

     難點就在于:VerifyCodeServlet的代碼實現(xiàn).對繪圖的代碼不是很熟悉。

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"; //隨機(jī)字符字典,其中0,o,1,I 等難辨別的字符最好不要
Random random = new Random();//隨機(jī)類
//1 創(chuàng)建圖片數(shù)據(jù)緩存區(qū)域(核心類)
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//創(chuàng)建一個彩色的圖片
//2 獲得畫板(圖片,ps圖層),繪畫對象。
Graphics g = image.getGraphics();
//3 選擇顏色,畫矩形3,4步是畫一個有內(nèi)外邊框的效果
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
//4白色矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2); /**1 提供緩存區(qū)域,為了存放4個隨機(jī)字符,以便存入session */
StringBuilder builder = new StringBuilder(); //5 隨機(jī)生成4個字符
//設(shè)置字體顏色
g.setFont(new Font("宋體", Font.BOLD&Font.ITALIC, 20));
for(int i = 0 ; i < 4 ;i ++){
//隨機(jī)顏色
g.setColor(new Color(random.nextInt(255),random.nextInt(255), random.nextInt(255))); //隨機(jī)字符
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);//隨機(jī)噪音點
} /**3 獲得隨機(jī)數(shù)據(jù),并保存session*/
String tempStr = builder.toString();
request.getSession().setAttribute("sessionCacheData",tempStr); //.. 生成圖片發(fā)送到瀏覽器 --相當(dāng)于下載
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 獲得服務(wù)器session 存放數(shù)據(jù) ,如果沒有返回null
String sessionCacheData = (String) request.getSession().getAttribute("sessionCacheData");
// *將服務(wù)器緩存session數(shù)據(jù)移除
request.getSession().removeAttribute("sessionCacheData");
// ** 判斷服務(wù)器是否存在
if(sessionCacheData == null){
request.setAttribute("msg", "請不要重復(fù)提交");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
//3 比較
if(! sessionCacheData.equalsIgnoreCase(verifyCode)){
//用戶輸入錯誤
// * 存放request作用域
request.setAttribute("msg", "驗證碼輸入錯誤");
// * 請求轉(zhuǎn)發(fā)
request.getRequestDispatcher("/login.jsp").forward(request, response); return;
} //...... 登錄操作 } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }

效果圖:

    

    驗證碼錯誤時:

      

注意:

    如果要拷貝代碼的話,需要改就應(yīng)該就是那幾處url,你的肯定跟我的不一樣,并且有些人設(shè)置的servlet的訪問路徑也不一樣,所以拷貝的話只需要拷貝關(guān)鍵代碼即可。

總結(jié)

以上是生活随笔為你收集整理的web开发(四) 一次性验证码的代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。