最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb 實(shí)現(xiàn)驗(yàn)證碼功能(demo)

 更新時(shí)間:2017年02月09日 09:42:58   投稿:mrr  
在 WEB-APP 中一般應(yīng)用于:登錄、注冊(cè)、買(mǎi)某票、秒殺等場(chǎng)景,大家都接觸過(guò)這個(gè)驗(yàn)證碼操作,今天小編通過(guò)實(shí)例代碼給大家講解javaweb實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友參考下

驗(yàn)證碼不用多說(shuō),在 WEB-APP 中一般應(yīng)用于:登錄、注冊(cè)、買(mǎi)某票、秒殺等場(chǎng)景。大家都接觸過(guò)~可以說(shuō)是千奇百怪,各式各樣。

DEMO 目標(biāo)功能

  • 驗(yàn)證碼頁(yè)面輸入。
  • 頁(yè)面更換驗(yàn)證碼(異步實(shí)現(xiàn))。
  • 后臺(tái)驗(yàn)證并返回驗(yàn)證結(jié)果。

開(kāi)工

頁(yè)面:demo1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
 <head>
 <title>驗(yàn)證示例</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">
 <style type="text/css">
 img {
 width: 87px;
 height: 33px;
 border: 1px solid gray;
 }
 #msg {color: red;} /* 后臺(tái)返回的驗(yàn)證信息顯示為紅色 */
 </style>
 </head>
 <body>
 <form action="${pageContext.request.contextPath}/check" method="post" enctype="application/x-www-form-urlencoded">
 驗(yàn)證碼:<input type="text" name="code" size="4" maxlength="4" id="code" /> 
 <img id="code-img" src="" alt="驗(yàn)證碼" style="display: none;"/> 
 <a href="javascript:void(0)" rel="external nofollow" id="changeCode">看不清?換一張</a> <br/><br/>
 <input type="submit" value="驗(yàn)證"/> <span id="msg">${msg}</span>
 </form>
 </body>
</html>

說(shuō)明:

  "看不清?換一張" 的 href 屬性寫(xiě)成 javascript:void(0) 是為了防止頁(yè)面刷新,這里的更換功能交給 AJAX 異步完成。

JavaScript 工具:util.js(為啥用原生 JS?任性唄~哈)

/**
 * 獲取 XMLHttpRequest Object
 * @returns XMLHttpRequest Object
 */
function getXHR() {
 var xmlHttp;
 try { // Firefox, Opera 8.0+, Safari
 xmlHttp = new XMLHttpRequest();
 } catch (e) { // Internet Explorer
 try {
 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
 try {
 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 } catch (e) {
 alert("Sorry, 您的瀏覽器不支持 AJAX!");
 return false;
 }
 }
 }
 return xmlHttp;
}

頁(yè)面中的 JavaScript 代碼

<script type="text/javascript" src="${pageContext.request.contextPath}/js/util.js"></script>
 <script type="text/javascript">
 var xhr = getXHR(); // 獲得 XMLHttpRequest 對(duì)象
 // 頁(yè)面加載時(shí)加載驗(yàn)證碼,但驗(yàn)證碼初始為隱藏狀態(tài)
 window.onload=function() {
 // 為 onreadystatechange 事件注冊(cè)回調(diào)函數(shù)。由于 xhr 為全局變量,所以注冊(cè)后就不用管啦
 xhr.onreadystatechange=function() {
 if(xhr.readyState==4 && xhr.status==200) {
 document.getElementById('code-img').src="data:image/png;base64,"+xhr.responseText;
 }
 }
 xhr.open("GET","${pageContext.request.contextPath}/captcha/code",true);
 xhr.send(null);
 }
 // 驗(yàn)證碼輸入框獲得焦點(diǎn)時(shí),驗(yàn)證碼狀態(tài)更改為顯示
 document.getElementById('code').onfocus=function() {
 document.getElementById('code-img').style.display="inline";
 }
 // 異步請(qǐng)求,更換驗(yàn)證碼
 document.getElementById('changeCode').onclick=function() {
 xhr.open("GET","${pageContext.request.contextPath}/captcha/code",true);
 xhr.send(null);
 }
 </script>

生成驗(yàn)證碼的 CaptchaCodeServlet.java

package com.leo.web.captcha;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.leo.util.ImageUtil;
import cn.dsna.util.images.ValidateCode;
@WebServlet("/captcha/code")
public class CaptchaCodeServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 { 
 // 生成驗(yàn)證碼(構(gòu)造參數(shù)分別代表:寬度,高度,字符數(shù),干擾線條數(shù))
 ValidateCode code = new ValidateCode(87, 33, 4, 23);
 // 將驗(yàn)證碼保存到 session 中,用于驗(yàn)證
 request.getSession().setAttribute("code", code.getCode());
 // 響應(yīng)返回驗(yàn)證碼圖片 base64 編碼后的數(shù)據(jù)給瀏覽器
 response.getWriter().write(ImageUtil.encodeImg2Base64(code.getBuffImg(), "png"));
 }
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
 this.doGet(request, response);
 }
}

說(shuō)明:

  這里使用了 Servlet3.0 的新特性-用注解配置 url-pattern(用起來(lái)挺爽的),也就是說(shuō)簡(jiǎn)單的項(xiàng)目不再需要 web.xml 了,但是 Tomcat 需要 7.0+。

  其次生成驗(yàn)證碼我用了一個(gè)小工具:ValidateCode.jar。工具十分簡(jiǎn)單,不合心意完全可以自己寫(xiě)。但也就是因?yàn)楣δ芴?,所以我又?xiě)了一個(gè) ImageUtil。我也有打算自己開(kāi)源一個(gè)驗(yàn)證碼工具出來(lái)。

ImageUtil.java

package com.leo.util;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import sun.misc.BASE64Encoder;
public class ImageUtil {
 /**
 * 將圖片二進(jìn)制數(shù)據(jù)進(jìn)行 base64 編碼
 * @param bufImg
 * @return base64 編碼后的字符串
 */
 public static String encodeImg2Base64(BufferedImage bufImg, String formatName) {
 ByteArrayOutputStream outputStream = null;
 try {
 outputStream = new ByteArrayOutputStream();
 ImageIO.write(bufImg, formatName, outputStream);
 } catch (IOException e) {
 throw new RuntimeException("Base64 編碼失敗!"+e.getMessage());
 }
 BASE64Encoder encoder = new BASE64Encoder();
 return encoder.encode(outputStream.toByteArray());
 }
 private ImageUtil() {} // 工具類(lèi)私有化構(gòu)造方法是常見(jiàn)的做法
}

說(shuō)明:

  為什么要把圖片二進(jìn)制數(shù)據(jù)進(jìn)行 Base64編碼 呢?因?yàn)?code><img/>標(biāo)簽雖然可以直接設(shè)置 src 屬性值為${pageContext.request.contextPath}/captcha/code請(qǐng)求相應(yīng)的 Servlet 來(lái)得到二進(jìn)制數(shù)據(jù)直接顯示,但在 AJAX 異步請(qǐng)求中響應(yīng)返回的是 xhr.responseText 。當(dāng)把數(shù)據(jù)直接給 img 標(biāo)簽的 src 屬性時(shí),用 Chrome-tool 查看只會(huì)是一堆二進(jìn)制當(dāng)作文本解析的亂碼字符,所以才要多這一步。

  或許我作為萌新不知道一些其它的方便技巧。但若不想使用異步,那直接 img src 設(shè)置為請(qǐng)求地址將是最簡(jiǎn)單的選擇,更換驗(yàn)證碼無(wú)非是監(jiān)聽(tīng)事件 img src 重新設(shè)置為該地址(再來(lái)一次請(qǐng)求)。

  詳細(xì)的資料:JS在瀏覽器中解析Base64編碼圖像

        Base64圖片編碼解析及瀏覽器的兼容性處理

后臺(tái)驗(yàn)證驗(yàn)證碼:CheckServlet.jave

package com.leo.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/check")
public class CheckServlet extends HttpServlet {
 private static final long serialVersionUID = -6588625852621588221L;
 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
 String encoding = "UTF-8";
 request.setCharacterEncoding(encoding);
 response.setContentType("text/html;charset="+encoding);
 /* 驗(yàn)證碼驗(yàn)證 */
 String inputCode = request.getParameter("code");
 // 獲得 session 中的正確驗(yàn)證碼
 String realCode = (String) request.getSession().getAttribute("code");
 System.out.println("input: "+inputCode+"\nreal: "+realCode); // 用于 Debug
 if(!(inputCode!=null && realCode!=null &&
 inputCode.equalsIgnoreCase(realCode))) {
 // 若驗(yàn)證碼不正確:回到頁(yè)面并提示錯(cuò)誤
 request.setAttribute("msg", "驗(yàn)證碼錯(cuò)誤!請(qǐng)重新輸入");
 request.getRequestDispatcher("/demo1.jsp").forward(request, response);
 return;
 }
 // 驗(yàn)證碼正確,響應(yīng)一句話表示 OK
 response.getWriter().write("驗(yàn)證成功!");
 }
 @Override
 public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException
 {
 doGet(request, response);
 }
}

說(shuō)明:

  doGet() 方法一開(kāi)始是對(duì)中文亂碼進(jìn)行處理,編碼統(tǒng)一設(shè)為 UTF-8。在實(shí)際項(xiàng)目中,編碼問(wèn)題通常交給一個(gè) Filter 完成,達(dá)到一勞永逸的效果。

效果

警告!警告!!顏控請(qǐng)速速撤離?。?!

寫(xiě)在最后

  以上就是 JavaWeb 驗(yàn)證碼小 DEMO 的全部?jī)?nèi)容啦,最好是把驗(yàn)證提交也搞成異步的,這里就不整了。WEB 項(xiàng)目中還沒(méi)嘗試過(guò)添加驗(yàn)證碼功能的小伙伴可以動(dòng)手搞起來(lái)啦!實(shí)際項(xiàng)目中利用 JQuery 等框架處理 AJAX,再配上一個(gè)漂亮的前端頁(yè)面就完美啦。

以上所述是小編給大家介紹的JavaWeb 實(shí)現(xiàn)驗(yàn)證碼功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring 報(bào)錯(cuò):元素

    Spring 報(bào)錯(cuò):元素 "context:component-scan" 的前綴 "context" 未綁定的問(wèn)題解決

    這篇文章主要介紹了Spring 報(bào)錯(cuò):元素 "context:component-scan" 的前綴 "context" 未綁定的問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 詳解Java中的實(shí)例初始化塊(IIB)

    詳解Java中的實(shí)例初始化塊(IIB)

    在本篇文章里我們針對(duì)Java中的實(shí)例初始化塊(IIB)做想詳細(xì)分析,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2018-10-10
  • Java實(shí)例化類(lèi)詳解

    Java實(shí)例化類(lèi)詳解

    學(xué)習(xí)JAVA這門(mén)面向?qū)ο蟮恼Z(yǔ)言,實(shí)質(zhì)就是不斷地創(chuàng)建類(lèi),并把類(lèi)實(shí)例化為對(duì)象并調(diào)用方法。對(duì)于初學(xué)JAVA的人總搞清楚對(duì)象是如何實(shí)例化的,假如類(lèi)之間存在繼承關(guān)系,那就更糊涂了。下面我們通過(guò)兩個(gè)例題來(lái)說(shuō)明對(duì)象的實(shí)例化過(guò)程。
    2016-03-03
  • spring多個(gè)事務(wù)管理器踩坑及解決

    spring多個(gè)事務(wù)管理器踩坑及解決

    這篇文章主要介紹了spring多個(gè)事務(wù)管理器踩坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JDK、J2EE、J2SE、J2ME四個(gè)易混淆概念區(qū)分

    JDK、J2EE、J2SE、J2ME四個(gè)易混淆概念區(qū)分

    這篇文章將向你詳細(xì)介紹JDK、J2EE、J2SE、J2ME的概念以及他們的關(guān)系區(qū)別。
    2015-09-09
  • SWT(JFace)體驗(yàn)之Icon任我變

    SWT(JFace)體驗(yàn)之Icon任我變

    SWT(JFace)體驗(yàn)之Icon任我變
    2009-06-06
  • Java中jar包運(yùn)行后顯示:沒(méi)有主清單屬性的解決方案

    Java中jar包運(yùn)行后顯示:沒(méi)有主清單屬性的解決方案

    這篇文章主要介紹了Java中jar包運(yùn)行后顯示:沒(méi)有主清單屬性的解決方案,文中給大家分析了三個(gè)主要原因,并通過(guò)代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Servlet文件的上傳與下載詳解

    Servlet文件的上傳與下載詳解

    很多朋友不清楚在Servlet中怎么上傳下載文件,談到這個(gè)問(wèn)題,首先需要我們掌握開(kāi)發(fā)servlet的步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-06-06
  • Springboot整合Rabbitmq之Confirm和Return機(jī)制

    Springboot整合Rabbitmq之Confirm和Return機(jī)制

    這篇文章主要介紹了Springboot整合Rabbitmq之Confirm和Return詳解,本篇重點(diǎn)進(jìn)行Confirm?機(jī)制和Return?機(jī)制的實(shí)現(xiàn)和說(shuō)明,通過(guò)實(shí)例代碼相結(jié)合給大家詳細(xì)介紹,對(duì)Springboot整合Rabbitmq相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-02-02
  • java.util.NoSuchElementException原因及兩種解決方法

    java.util.NoSuchElementException原因及兩種解決方法

    本文主要介紹了java.util.NoSuchElementException原因及兩種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論

文山县| 海兴县| 彭山县| 隆尧县| 台东市| 卢湾区| 本溪| 多伦县| 广灵县| 莱西市| 荥经县| 仪征市| 柳江县| 威远县| 襄垣县| 来宾市| 阳朔县| 连平县| 鹤庆县| 讷河市| 驻马店市| 武冈市| 台中市| 宝清县| 遵义县| 宁国市| 犍为县| 延庆县| 隆回县| 若尔盖县| 云和县| 青龙| 广南县| 崇左市| 临海市| 宁波市| 北安市| 县级市| 凌云县| 丹阳市| 红安县|