現在許多系統的注冊登錄或者發布信息模塊都添加的隨機碼功能就是為了避免自動注冊程序或者自動發布程序的使用
驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上如果進行提交操作的同時需要將圖片上的字符同時提交如果提交的字符與服務器session保存的不同則認為提交信息無效為了避免自動程序分析解析圖片通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲增加自動識別的難度
在這裡我們使用servlet來實現隨機驗證碼的實現
package comservlet;
import javaawtColor;
import javaawtFont;
import javaawtGraphicsD;
import javaawtimageBufferedImage;
import javautilRandom;
import javaximageioImageIO;
import javaxservletServletException;
import javaxservletServletOutputStream;
import javaxservlet
import javaxservlet
import javaxservlet
import javaxservlet
/**
* 生成隨機驗證碼
* @author bitiliu
*
*/
public class ValidateCodeServlet extends HttpServlet
{
private static final long serialVersionUID = L;
//驗證碼圖片的寬度
private int width=;
//驗證碼圖片的高度
private int height=;
//驗證碼字符個數
private int codeCount=;
private int x=;
//字體高度
private int fontHeight;
private int codeY;
char[] codeSequence = { A B C D E F G H I J
K L M N O P Q R S T U V W
X Y Z };
/**
* 初始化驗證圖片屬性
*/
public void init() throws ServletException
{
//從webxml中獲取初始信息
//寬度
String strWidth=thisgetInitParameter("width");
//高度
String strHeight=thisgetInitParameter("height");
//字符個數
String strCodeCount=thisgetInitParameter("codeCount");
//將配置的信息轉換成數值
try
{
if(strWidth!=null && strWidthlength()!=)
{
width=IntegerparseInt(strWidth);
}
if(strHeight!=null && strHeightlength()!=)
{
height=IntegerparseInt(strHeight);
}
if(strCodeCount!=null && strCodeCountlength()!=)
{
codeCount=IntegerparseInt(strCodeCount);
}
}
catch(NumberFormatException e)
{}
x=width/(codeCount+);
fontHeight=height;
codeY=height;
}
protected void service(HttpServletRequest req HttpServletResponse resp)
throws ServletException javaioIOException {
//定義圖像buffer
BufferedImage buffImg = new BufferedImage(
width heightBufferedImageTYPE_INT_RGB);
GraphicsD g = buffImgcreateGraphics();
//創建一個隨機數生成器類
Random random = new Random();
//將圖像填充為白色
gsetColor(ColorWHITE);
gfillRect( width height);
//創建字體字體的大小應該根據圖片的高度來定
Font font = new Font("Fixedsys" FontPLAIN fontHeight);
//設置字體
gsetFont(font);
//畫邊框
gsetColor(ColorBLACK);
gdrawRect( width height );
//隨機產生條干擾線使圖象中的認證碼不易被其它程序探測到
gsetColor(ColorBLACK);
for(int i = ; i < ; i++)
{
int x = randomnextInt(width);
int y = randomnextInt(height);
int xl = randomnextInt();
int yl = randomnextInt();
gdrawLine(x y x + xl y + yl);
}
//randomCode用於保存隨機產生的驗證碼以便用戶登錄後進行驗證
StringBuffer randomCode = new StringBuffer();
int red = green = blue = ;
//隨機產生codeCount數字的驗證碼
for (int i = ; i < codeCount; i++) {
//得到隨機產生的驗證碼數字
String strRand = StringvalueOf(codeSequence[randomnextInt()]);
//產生隨機的顏色分量來構造顏色值這樣輸出的每位數字的顏色值都將不同
red = randomnextInt();
green = randomnextInt();
blue = randomnextInt();
//用隨機產生的顏色將驗證碼繪制到圖像中
gsetColor(new Color(red green blue));
gdrawString(strRand (i + ) * x codeY);
//將產生的四個隨機數組合在一起
randomCodeappend(strRand);
}
// 將四位數字的驗證碼保存到Session中
HttpSession session = reqgetSession();
sessionsetAttribute("validateCode" randomCodetoString());
// 禁止圖像緩存
respsetHeader("Pragma" "nocache");
respsetHeader("CacheControl" "nocache");
respsetDateHeader("Expires" );
respsetContentType("image/jpeg");
//將圖像輸出到Servlet輸出流中
ServletOutputStream sos = respgetOutputStream();
ImageIOwrite(buffImg "jpeg" sos);
sosclose();
}
}
需要在webxml中聲明servlet
<servlet>
<servletname>ValidateCodeServlet</servletname>
<servletclass>comservletValidateCodeServlet</servletclass>
<initparam>
<paramname>width</paramname>
<paramvalue></paramvalue>
</initparam>
<initparam>
<paramname>height</paramname>
<paramvalue></paramvalue>
</initparam>
<initparam>
<paramname>codeCount</paramname>
<paramvalue></paramvalue>
</initparam>
</servlet>
<servletmapping>
<servletname>ValidateCodeServlet</servletname>
<urlpattern>/validateCodeServlet</urlpattern>
</servletmapping>
需要引用的頁面可以這樣來寫
<ccid_file values="validateCodeServlet" width="/" />
用戶提交後就可以將用戶輸入的驗證碼與session中保存的字符串進行比對達到驗證的效果
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19913.html