コードは次のようになります。
java.awt.Colorをインポートします。
java.awt.Fontをインポートします。
java.awt.Graphicsをインポートします。
インポート java.awt.image.BufferedImage;
java.util.Randomをインポートします。
インポートjavax.imageio.ImageIO;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
/**
* <b>関数:</b> 検証コード生成ツール クラス
* @projectNetWorkService
* @パッケージcom.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 03:05:50 PM
*@著者hoojo
*/
@SuppressWarnings("未使用")
パブリック クラス ValidCodeUtils {
/************************************************ ***** *********************
* 認証コード幅
*/
パブリック静的 int WIDTH = 60;
/***
* 認証コードの高さ
*/
パブリック静的 int HEIGHT = 20;
/************************************************ ***** *********************
※認証コードCOLOR_FC_BGの背景色はCOLOR_BC_BGより小さい必要があります
*/
public static int COLOR_FC_BG = 200;
/***
※認証コードCOLOR_FC_BGの背景色はCOLOR_BC_BGより小さい必要があります
*/
public static int COLOR_BC_BG = 250;
/************************************************ ***** *********************
* 認証コードの背景干渉ラインの色 COLOR_FC_LINE は COLOR_BC_LINE より小さい必要があります
*/
public static int COLOR_FC_LINE = 160;
/***
* 認証コードの背景干渉ラインの色 COLOR_FC_LINE は COLOR_BC_LINE より小さい必要があります
*/
public static int COLOR_BC_LINE = 200;
/************************************************ ***** ***************************
* 確認コードの色 COLOR_FC_CODE は COLOR_BC_CODE より小さい必要があります
*/
public static int COLOR_FC_CODE = 20;
/***
* 確認コードの色 COLOR_FC_CODE は COLOR_BC_CODE より小さい必要があります
*/
public static int COLOR_BC_CODE = 170;
/************************************************ ***** ***************************
* 指定された範囲内の色を生成します
* @param fc range fc color 値は 255 未満です
* @param bc range bc color 値が 255 未満です
* @returnColor
*/
プライベート静的カラー getRandColor(int fc, int bc) {
ランダム ランダム = new Random();
if (fc < 0)
fc = 0;
if (bc < 0)
bc = 1;
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
if (bc == fc)
bc += 10;
int temp = 0;
if (bc < fc) {
温度 = 紀元前;
bc = fc;
fc = 温度;
}
int r = fc + ランダム.nextInt(bc - fc);
int g = fc + ランダム.nextInt(bc - fc);
int b = fc + ランダム.nextInt(bc - fc);
新しい Color(r, g, b) を返します。
}
/**
* <b>関数:</b> 画像メソッドを生成します
* @createDate 2010-8-3 03:06:22 PM
*@著者hoojo
* @param リクエスト HttpServletRequest
* @param レスポンス HttpServletResponse
* @return ブール値
* @throwsException
*/
public static boolean getImage(HttpServletRequest リクエスト、HttpServletResponse レスポンス) throws Exception{
応答.リセット();
response.setContentType("画像/jpeg");
// ページをキャッシュしないように設定します
response.setHeader("プラグマ", "キャッシュなし");
response.setHeader("キャッシュ制御", "キャッシュなし");
response.setDateHeader("有効期限", 0);
//メモリ上にイメージを作成
BufferedImage 画像 = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// グラフィックスコンテキストを取得します
グラフィックス img = image.getGraphics();
// ランダムなクラスを生成
ランダム ランダム = new Random();
//背景色を設定する
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, 幅, 高さ);
//フォントを設定する
img.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 境界線を描画します
// g.setColor(new Color());
// g.drawRect(0,0,width-1,height-1);
// 画像内の認証コードが他のプログラムによって検出されにくくするために、155 本の干渉線をランダムに生成します
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
for (int i = 0; i < 155; i++) {
int x = ランダム.nextInt(WIDTH);
int y = ランダム.nextInt(HEIGHT);
int xl = ランダム.nextInt(12);
int yl = ランダム.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// ランダムに生成された認証コード(4桁)を取得します
文字列コード値 = "";
for (int i = 0; i < 4; i++) {
//文字列 rand = String.valueOf(random.nextInt(10));
文字列ランド = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//ランダムフォント
//画像に認証コードを表示します
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//画像が有効になります
img.dispose();
// 画像をページに出力します
return ImageIO.write(画像, "JPEG", response.getOutputStream());
}
/**
* 大文字、小文字、数字を含む文字をランダムに生成します
* <b>関数:</b> 関数
* @createDate 2010-8-23 10:33:55 AM
*@著者hoojo
* @戻る
*/
public static String getRandomChar() {
int インデックス = (int) Math.round(Math.random() * 2);
文字列 randChar = "";
スイッチ (インデックス) {
case 0://大文字
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
壊す;
case 1://小文字
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
壊す;
デフォルト:://番号
randChar = String.valueOf(Math.round(Math.random() * 9));
壊す;
}
randChar を返します。
}
/**
* <b>機能:</b> フォントとテキスト サイズをランダムに生成します
* @createDate 2010-8-23 10:44:22 AM
*@著者hoojo
* @戻る
*/
パブリック静的フォント getRandomFont() {
String[] fonts = {"Georgia"、"Verdana"、"Arial"、"Tahoma"、"Time News Roman"、"Courier New"、"Arial Black"、"Quantzite"};
int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int fontSize = (int) Math.round(Math.random() * 4 + 16);
新しい Font(fonts[fontIndex], Font.PLAIN, fontSize) を返します。
}
}
検証コードの値はセッションに保存されます: request.getSession().setAttribute("codeValue", codeValue);
ユーザーが入力した値とセッション内の codeValue を比較して、それらが等しいかどうかを確認するだけです。
以下はサーブレットを呼び出す JSP ページです: ValidCodeServlet.java
上記のValidCodeUtils検証コード生成ツールクラスはValidCodeServlet内で呼び出されます。
パッケージ com.hoo.servlet;
インポート java.io.IOException;
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
com.hoo.util.ValidCodeUtils をインポートします。
@SuppressWarnings("シリアル")
public class ValidCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
試す {
ValidCodeUtils.getImage(リクエスト, レスポンス);
} catch (例外 e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
JSPページでサーブレットメソッドを呼び出すだけです
js:reloadValidCodeメソッド
関数 reloadValidCode(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds();
}
ここでの "timed=" + new Date().getMilliseconds(); は、IE キャッシュを防ぐために必要です。
htmlタグ:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
web.xml 設定に対応するサーブレット名を使用して URL を直接設定するだけです。メインの呼び出しパス ${pageContext.request.contextPath}/validCodeServlet は、より安全なルート ディレクトリを取得します。
web.xml の validCodeServlet 設定
<サーブレット>
<サーブレット名>validCodeServlet</サーブレット名>
<サーブレットクラス>com.hoo.servlet.ValidCodeServlet</サーブレットクラス>
</サーブレット>
<サーブレットマッピング>
<サーブレット名>validCodeServlet</サーブレット名>
<url-pattern>/validCodeServlet</url-pattern>
</サーブレットマッピング>