圖形認證碼技術的JSP實現

來源:互聯網
上載者:User
js|圖形

 實現認證碼技術,需要以下幾方面的準備:

  1.產生認證碼:

  我們可以讓系統隨機產生一個數字來作為認證碼,這方面在Javascript指令碼語言和JAVA語言中均可得以實現。前者可以用Math.random()得到一個介於0與1之間的小數,用它乘以10000再取整數部分,即可得到0至9999之間的隨機數。後者可以用Random類的nextInt(N)方法得到一個介於0至N-1之間的隨機類。

  在實現時,我們採用了前者,即用Javascript產生的隨機數作為認證碼。主要原因是Javascript是HTML內建的指令碼語言,不管頁面是前進、後退還是重新整理,都能保證及時產生新的認證碼,增加了隨機性。而用JAVA實現時,則不具備此特性,瀏覽器還儲存原先的認證碼,隨機性不強。

  2.產生認證碼圖象:

  這是比較關鍵的部分。幸運的是,JAVA語言給我們提供了強大的支援。我們可以利用BufferedImage類在記憶體中繪製圖象,並可利用ImageIO類將圖象輸出到JSP頁面中。在繪製圖象時,我們就可以將隨機產生的認證碼,繪製到圖象中,進而展現在使用者面前。另,為了增加破譯的難度,我們可以隨機畫一些點。

  3.儲存認證碼:

  在JSP語言中,我們可以充分利用該語言內建的SESSION對象來儲存認證碼之值,方法是:session.setAttribute("認證碼名字",認證碼之值)。並可用session.getAttribute("認證碼名字")得到系統儲存的認證碼之值,用來和使用者輸入的認證碼相比較,很是方便。

  三、認證碼技術的JSP實現

  1.image.jsp

  這個JSP程式的功能是:根據頁面參數rand產生相應的認證碼圖象,同時設定SESSION變數rand,以便check.jsp驗證使用者輸入的認證碼時使用。

  來源程式如下:
<%@ page contentType="image/jpeg" import="java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*" %>
<%
// 在記憶體中建立圖象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);

// 擷取圖形上下文
Graphics g = image.getGraphics();

// 設定背景色
g.setColor(Color.white);
g.fillRect(0, 0, width, height);

//畫邊框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);

// 取隨機產生的認證碼(4位元字)
String rand = request.getParameter("rand");
rand = rand.substring(0,rand.indexOf("."));
switch(rand.length())
{
case 1: rand = "000"+rand; break;
case 2: rand = "00"+rand; break;
case 3: rand = "0"+rand; break;
default: rand = rand.substring(0,4); break;
}

// 將認證碼存入SESSION
session.setAttribute("rand",rand);

// 將認證碼顯示到圖象中
g.setColor(Color.black);
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.drawString(rand,10,15);

// 隨機產生88個幹擾點,使圖象中的認證碼不易被其它程式探測到
Random random = new Random();
for (int i=0;i<88;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
g.drawLine(x,y,x,y);
}

// 圖象生效
g.dispose();

// 輸出圖象到頁面
ImageIO.write(image, "JPEG", response.getOutputStream());

%>
2.a.jsp

  這個JSP程式的功能是:顯示認證碼,提供表單讓使用者輸入認證碼供校正用。注意,程式中顯示認證碼圖象時,用了Javascript的document.write,並用了Math.random函數,從而保證了認證碼的及時更新特性。

  來源程式如下:
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>認證碼輸入頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系統產生的認證碼:</td>
<td><script>document.write("<img border=0 src=image.jsp?
rand="+Math.random()*10000+">");</script></td>
</tr>
<tr>
<td align=left>輸入上面的認證碼:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交檢測"></td>
</tr>
</form>
</body>
</html>

3.check.jsp

  這個JSP程式的作用是比較使用者輸入的認證碼與SESSION變數中儲存的認證碼,相同時提示認證成功,否則提示認證失敗。

  來源程式如下:

<%@ page contentType="text/html; charset=gb2312" language="java"
import="java.sql.*" errorPage="" %>
<html>
<head>
<title>認證碼驗證頁面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>

<body>
<%
String rand = (String)session.getAttribute("rand");
String input = request.getParameter("rand");
%>
系統產生的認證碼為: <%= rand %><br>
您輸入的認證碼為: <%= input %><br>
<br>
<%
  if (rand.equals(input)) {
%>
<font color=green>輸入相同,認證成功!</font>
<%
  } else {
%>
<font color=red>輸入不同,認證失敗!</font>
<%
  }
%>
</body>
</html>


 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.