JSP 制作驗證碼的實例詳解
驗證碼
驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計算機和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現(xiàn)在很多網(wǎng)站通行的方式,我們利用比較簡易的方式實現(xiàn)了這個功能。這個問題可以由計算機生成并評判,但是必須只有人類才能解答。由于計算機無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認(rèn)為是人類。
Jsp制作驗證碼
運行環(huán)境:tomcat+eclipse+jdk
基本思想:現(xiàn)在Servlet上畫出驗證碼的圖片,讓其顯示到頁面上,再用js方法能刷新驗證碼,可以用ajax得到用戶輸入的值經(jīng)過servlet跟驗證碼比對判斷是否,并符合提示用戶
基本方法:
BufferedImage:
Image是一個抽象列,BufferedImage是Image的實現(xiàn)。 Image和BufferedImage的主要作用就是將一副圖片加載到內(nèi)存中。 Java將一副圖片加載到內(nèi)存中的方法是: Java代碼 String imgPath = "d:/demo.jpg"; BufferedImage image = ImageIO.read(new FileInputStream(imgPath)); 該方法可以獲得圖片的詳細(xì)信息,例如:獲得圖片的寬度:image.getWidth(null);圖片只有加載內(nèi)存中才能對圖片進行進一步的處理。
Graphics:
Graphics類提供基本的幾何圖形繪制方法,主要有:畫線段、畫矩形、畫圓、畫帶顏色的圖形、畫橢圓、畫圓弧、畫多邊形等,具體操作其內(nèi)容我推薦可以看看使用Java的Graphics類進行繪圖的方法詳解
驗證碼的代碼實現(xiàn)
我這里做的驗證碼是顯示中文的,可以在servlet中修改想要顯示的是數(shù)字還是字母還是結(jié)合的,可以用數(shù)組存放這些,也可以轉(zhuǎn)換ASCII碼經(jīng)行隨機數(shù)字,看個人喜好
先是做一個jsp中的驗證碼的地方
div class="row cl"> div> input type="text" placeholder="驗證碼" value="驗證碼:" onblur="testCheck(this.value);"> img id="pic" src="CheckTestServlet"> a id="kanbuq" onClick="Checktest();">看不清,換一張/a> /div> /div>
在做一個Servlet叫做CheckTestServlet.java
@WebServlet("/CheckTestServlet") public class CheckTestServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //這個方法實現(xiàn)驗證碼的生成 response.setCharacterEncoding("utf-8"); //創(chuàng)建圖片緩沖區(qū)設(shè)置其大小 BufferedImage(int width, int height, int imageType) BufferedImage bImage=new BufferedImage(100, 30, BufferedImage.TYPE_3BYTE_BGR); //在緩沖區(qū)上創(chuàng)建畫布 Graphics g=bImage.getGraphics(); //設(shè)置背景顏色 g.setColor(Color.orange); //創(chuàng)建畫布矩形,位置(0,0)點,大小100,30 g.fillRect(0, 0, 100, 30); //創(chuàng)建隨機對象 Random r=new Random(); int index;//存放隨機數(shù) //得到的文字東西存放處 StringBuffer sBuffer=new StringBuffer(); //循環(huán)產(chǎn)生四個字 for (int i = 0; i 4; i++) { //中文字的第一個十六進制碼為4e00轉(zhuǎn)十進制是19968,最后一個是9fa0十進制為40869,所以可以產(chǎn)生在此之間的隨機數(shù) index=r.nextInt(40869-19968+1)+19968;//產(chǎn)生隨機數(shù)字 //設(shè)置隨機顏色, g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255))); //設(shè)置文字的類型,大小 g.setFont(new Font("", Font.BOLD, 20)); /*畫字,將隨機數(shù)字轉(zhuǎn)換成十六進制Integer.toHexString(index),16)再轉(zhuǎn)換字符(char)(Integer.parseInt, 在設(shè)置每個文字的位置 */ g.drawString((char)(Integer.parseInt(Integer.toHexString(index),16))+"", i*22+4, 18); //將其存放在StringBuffer中,以便后面讀取作比較 sBuffer.append((char)(Integer.parseInt(Integer.toHexString(index),16))); } //將得到的文字設(shè)置到session中 request.getSession().setAttribute("piccode", sBuffer.toString()); /*將這個驗證碼圖片讀寫到頁面中 * write(RenderedImage im, String formatName, OutputStream output) */ ImageIO.write(bImage, "jpg", response.getOutputStream()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }
在做一個js刷新驗證碼的,用于看不清,或者別的刷新用處
function Checktest(){ var time=new Date().getTime(); $("#pic").attr('src',"CheckTestServlet?d="+time) }
再寫一個Ajax去驗證用戶輸入的是否正確返回提示,這是用jQuery做的,需要引js
function testCheck(num){ $.ajax({ type:"post",//提交方式 url:"TestCheckServlet",//提交地址 async:true,//是否異步請求 dataType:"html",//返回類型 data:{"num":num},//傳過去的值 success:function(data,textStatus){//成功執(zhí)行的方法 $("#checks").html(data) }, error:function(){//失敗執(zhí)行的方法 alert("error"); } }) }
有點麻煩的再去做一個Servlet去驗證Ajax傳過來的值是否匹配驗證碼
@WebServlet("/TestCheckServlet") public class TestCheckServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); PrintWriter out=response.getWriter(); //得到輸入的驗證碼與隨機的圖片驗證碼作比較,判斷是否相等,返回提示用戶, if (request.getSession().getAttribute("piccode").toString().equals(request.getParameter("num"))) { out.println("驗證碼正確"); }else { out.println("驗證碼錯誤"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
就這樣驗證碼已經(jīng)基本搞定,其中還有許多需要修改的內(nèi)容,花樣,根據(jù)需求而來
以上就是二維碼的制作,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
標(biāo)簽:內(nèi)江 樂山 銅川 廣州 貸款邀約 大連 黃石 南京
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP 制作驗證碼的實例詳解》,本文關(guān)鍵詞 JSP,制作,驗證,碼,的,實例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。下一篇:Jsp敏感詞過濾的示例代碼