JSP 制作驗(yàn)證碼的實(shí)例詳解
JSP 制作驗(yàn)證碼的實(shí)例詳解
驗(yàn)證碼
驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測(cè)試)的縮寫,是一種區(qū)分用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序??梢苑乐梗簮阂馄平饷艽a、刷票、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,實(shí)際上用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式,我們利用比較簡(jiǎn)易的方式實(shí)現(xiàn)了這個(gè)功能。這個(gè)問題可以由計(jì)算機(jī)生成并評(píng)判,但是必須只有人類才能解答。由于計(jì)算機(jī)無法解答CAPTCHA的問題,所以回答出問題的用戶就可以被認(rèn)為是人類。
Jsp制作驗(yàn)證碼
運(yùn)行環(huán)境:tomcat+eclipse+jdk
基本思想:現(xiàn)在Servlet上畫出驗(yàn)證碼的圖片,讓其顯示到頁面上,再用js方法能刷新驗(yàn)證碼,可以用ajax得到用戶輸入的值經(jīng)過servlet跟驗(yàn)證碼比對(duì)判斷是否,并符合提示用戶
基本方法:
BufferedImage:
Image是一個(gè)抽象列,BufferedImage是Image的實(shí)現(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)存中才能對(duì)圖片進(jìn)行進(jìn)一步的處理。
Graphics:
Graphics類提供基本的幾何圖形繪制方法,主要有:畫線段、畫矩形、畫圓、畫帶顏色的圖形、畫橢圓、畫圓弧、畫多邊形等,具體操作其內(nèi)容我推薦可以看看使用Java的Graphics類進(jìn)行繪圖的方法詳解
驗(yàn)證碼的代碼實(shí)現(xiàn)
我這里做的驗(yàn)證碼是顯示中文的,可以在servlet中修改想要顯示的是數(shù)字還是字母還是結(jié)合的,可以用數(shù)組存放這些,也可以轉(zhuǎn)換ASCII碼經(jīng)行隨機(jī)數(shù)字,看個(gè)人喜好
先是做一個(gè)jsp中的驗(yàn)證碼的地方
<div class="row cl">
<div>
<input type="text" placeholder="驗(yàn)證碼" value="驗(yàn)證碼:" onblur="testCheck(this.value);">
<img id="pic" src="CheckTestServlet"> <a id="kanbuq" onClick="Checktest();">看不清,換一張</a> </div>
</div>
在做一個(gè)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 {
//這個(gè)方法實(shí)現(xiàn)驗(yà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)點(diǎn),大小100,30
g.fillRect(0, 0, 100, 30);
//創(chuàng)建隨機(jī)對(duì)象
Random r=new Random();
int index;//存放隨機(jī)數(shù)
//得到的文字東西存放處
StringBuffer sBuffer=new StringBuffer();
//循環(huán)產(chǎn)生四個(gè)字
for (int i = 0; i < 4; i++) {
//中文字的第一個(gè)十六進(jìn)制碼為4e00轉(zhuǎn)十進(jìn)制是19968,最后一個(gè)是9fa0十進(jìn)制為40869,所以可以產(chǎn)生在此之間的隨機(jī)數(shù)
index=r.nextInt(40869-19968+1)+19968;//產(chǎn)生隨機(jī)數(shù)字
//設(shè)置隨機(jī)顏色,
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//設(shè)置文字的類型,大小
g.setFont(new Font("", Font.BOLD, 20));
/*畫字,將隨機(jī)數(shù)字轉(zhuǎn)換成十六進(jìn)制Integer.toHexString(index),16)再轉(zhuǎn)換字符(char)(Integer.parseInt,
在設(shè)置每個(gè)文字的位置
*/
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());
/*將這個(gè)驗(yàn)證碼圖片讀寫到頁面中
* 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);
}
在做一個(gè)js刷新驗(yàn)證碼的,用于看不清,或者別的刷新用處
function Checktest(){
var time=new Date().getTime();
$("#pic").attr('src',"CheckTestServlet?d="+time)
}
再寫一個(gè)Ajax去驗(yàn)證用戶輸入的是否正確返回提示,這是用jQuery做的,需要引js
function testCheck(num){
$.ajax({
type:"post",//提交方式
url:"TestCheckServlet",//提交地址
async:true,//是否異步請(qǐng)求
dataType:"html",//返回類型
data:{"num":num},//傳過去的值
success:function(data,textStatus){//成功執(zhí)行的方法
$("#checks").html(data)
},
error:function(){//失敗執(zhí)行的方法
alert("error");
}
})
}
有點(diǎn)麻煩的再去做一個(gè)Servlet去驗(yàn)證Ajax傳過來的值是否匹配驗(yàn)證碼
@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();
//得到輸入的驗(yàn)證碼與隨機(jī)的圖片驗(yàn)證碼作比較,判斷是否相等,返回提示用戶,
if (request.getSession().getAttribute("piccode").toString().equals(request.getParameter("num"))) {
out.println("驗(yàn)證碼正確");
}else {
out.println("驗(yàn)證碼錯(cuò)誤");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
就這樣驗(yàn)證碼已經(jīng)基本搞定,其中還有許多需要修改的內(nèi)容,花樣,根據(jù)需求而來
以上就是二維碼的制作,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
jsp實(shí)現(xiàn)用戶自動(dòng)登錄功能
這篇文章主要為大家詳細(xì)介紹了jsp實(shí)現(xiàn)用戶自動(dòng)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
jsp頁面獲取服務(wù)器時(shí)間的簡(jiǎn)單調(diào)用示例
這篇文章主要介紹了jsp頁面如何獲取服務(wù)器時(shí)間及簡(jiǎn)單的調(diào)用示例,需要的朋友可以參考下2014-06-06
淺談JSP serverlet的區(qū)別與聯(lián)系
下面小編就為大家?guī)硪黄獪\談JSP serverlet的區(qū)別與聯(lián)系。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
深入淺析Jsp中 out.print 和 out.write 的區(qū)別
本文簡(jiǎn)明扼要的給大家介紹了jsp中 out.print 和 out.write 的區(qū)別,雖然本文簡(jiǎn)短但是主要內(nèi)容給大家介紹清楚了,需要的朋友參考下吧2017-02-02
JBuilderX+SQL Server開發(fā)hibernate
JBuilderX+SQL Server開發(fā)hibernate...2006-10-10
JSP 自定義標(biāo)簽實(shí)現(xiàn)數(shù)據(jù)字典的實(shí)例
這篇文章主要介紹了JSP 自定義標(biāo)簽實(shí)現(xiàn)數(shù)據(jù)字典的實(shí)例的相關(guān)資料,這里實(shí)現(xiàn)這樣的功能,希望能幫助到大家,需要的朋友可以參考下2017-08-08
JSP程序運(yùn)行原理、文檔結(jié)構(gòu)及簡(jiǎn)單輸入輸出實(shí)例分析
這篇文章主要介紹了JSP程序運(yùn)行原理、文檔結(jié)構(gòu)及簡(jiǎn)單輸入輸出,以完整實(shí)例形式較為詳細(xì)的分析了JSP程序的運(yùn)行原理、文檔結(jié)構(gòu)及簡(jiǎn)單輸入輸出詳細(xì)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09

