如何在用戶注冊或登錄時使用驗證碼圖片(轉(zhuǎn))
1、
策略
1.1?? 在用戶登錄或注冊的 jsp 頁面上創(chuàng)用驗證碼圖片,顯示在界面上,同時將驗證碼構(gòu)成的字符串保存到會話中。
1.2?? 在后臺檢查用戶上傳的驗證信息是否與保存在會話中的驗證碼字符串相同,如果不同要求用戶重輸。
2、
產(chǎn)生驗證碼圖片的
java
代碼:
package bbs.business;
?
import javax.servlet.ServletRequest;
import java.util.Random;
import java.awt.Font;
import javax.servlet.http.HttpServletRequest;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
?
public class ValidateImage {
??? public static String createImage(ServletRequest request,String imageName){
??????? HttpServletRequest servletRequest=(HttpServletRequest)request;
??????? Random random=new Random();
??????? String valiCode="";
??????? for (int i = 0; i < 4; i++) {
??????????? String rand = String.valueOf(random.nextInt(10));
??????? ????valiCode+=rand;
??????? }
??????? if(servletRequest.getSession()==null)
??????????? servletRequest.getSession().setAttribute("valiCode",valiCode);
??????? else
??????????? servletRequest.getSession(false).setAttribute("valiCode",valiCode);
?
??????? int width = 60, height = 20;
??????? BufferedImage image = new BufferedImage(width, height,
??????????????????????????????????????????????? BufferedImage.TYPE_INT_RGB);
??????? Graphics g = image.getGraphics();
??????? g.setColor(new Color(0xDCDCDC));
?????? ?g.fillRect(0, 0, width, height);
??????? g.setColor(Color.black);
??????? g.drawRect(0,0,width-1,height-1);
??????? g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
??????? g.setColor(Color.black);
??????? g.drawString(valiCode.substring(0,1), 8, 17);
??????? g.drawString(valiCode.substring(1,2), 20, 15);
??????? g.drawString(valiCode.substring(2,3), 35, 18);
??????? g.drawString(valiCode.substring(3,4), 45, 15);
??????? g.dispose();
??????? servletRequest.getSession(false).setAttribute(imageName,image);
??????? return valiCode;
??? }
}
方法 createImage(ServletRequest request,String imageName) 產(chǎn)生圖片并以 imageName 為鍵名保存到會話中,返回圖片上顯示的字符串,這個字符也以“ valiCode ”為鍵名保存在會話中。
3、
運(yùn)用方法
3.1 在 jsp 頁面上產(chǎn)生驗證碼圖片并顯示,將字符保存在會話中。
??? <td> 驗證碼 </td>
??? <td>
<html:text property="valiCode" size="8"></html:text>
</td>
??? <% bbs.business.ValidateImage.createImage(request,"valiImage");%>
??? <td>
??? ????<nhtml:image name="valiImage" path="/showImage" refresh="true"/> *
??? </td>
???
效果如下:
???
<nhtml:image name="valiImage" path="/showImage" refresh="true"/> 使用了 newxy新坐標(biāo) 的標(biāo)簽 <nhtml:image/> , 作用是顯示內(nèi)存中的圖片。
3.2 在后臺進(jìn)行比較。
??? String valiCode=(String) user.get("valiCode");
??? if (valiCode == null || !(valiCode.equals(servletRequest.getSession(false).getAttribute("valiCode")))) {
??????????? servletRequest.setAttribute("message", " 提示:驗證碼不正確! ");
??????????? return forward;
??? }
??? user 是 formBean , valiCode 是用戶上傳的驗證信息。如果上傳的驗證信息不等于保存在會話中的驗證信息則返回。
posted on 2007-03-20 09:17 liaojiyong 閱讀(501) 評論(0) 編輯 收藏