1。序文
フォームページで検証コードを使用する利点は、ユーザーが悪意を持ってフォームを送信することを効果的に防止したり、プラグインを使用してシステムを違法に攻撃することを防ぐことです。
2。準備条件
1.通常のWebプロジェクトWebProject。
2。WebサーバーTomcat。
3。実装のアイデア:
1.サーブレットVerifyCodeServletをカスタマイズして、検証文字を含む検証コード画像を描画します。ここの写真は、Graphics2dを使用して手動で描画する必要があります。
2。IMGタグのSRCを使用して、特定のページのこのサーブレットを参照してサーブレットを表示します。
3.フォームを送信した後、検証コード情報が画像を描画するときにセッションに配置されるため、セッションで保存された値をユーザーが入力したコードと比較して、入力が正しいかどうかを確認できます。
サーブレットを介して実装された検証コードのほとんどはオンラインで実装されており、以下のロジックが入力されます。
ステップ:
1.ページへのログインを要求するときに、検証コード文字列をランダムに生成します。
2。セッションに生成された検証コード文字列を保存します。
3.検証コード文字列に基づいて検証コード画像を生成し、表示する検証コード写真を顧客に出力します。
4.セッションの文字列でログイン要求を送信するときにユーザーが入力した検証コード文字列を比較します。
4.特定のコードは次のとおりです。
パッケージcom.servlet; java.awt.colorをインポートします。 java.awt.fontをインポートします。 java.awt.graphics2dをインポートします。 java.awt.image.bufferedimageをインポートします。 java.util.randomをインポートします。 javax.imageio.imageioをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.servletoutputStreamをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 javax.servlet.http.httpsessionをインポートします。 / ** *検証コードイメージを生成するサーブレット * @Author Administrator * */ public Class verifyCodeServletはhttpservletを拡張します{private static final long serialversionuid = -5051097528828603895l; /***検証コード画像の幅。 */ private int width = 100; /***検証コード画像の高さ。 */ private int height = 30; / ***検証コード文字の数*/ private int codecount = 4; / *** font height*/ private int fontheight; / ***最初の文字のX軸値。次の文字の座標は順番に増分されるため、X軸値はCodex*/ private int codexの倍数です。 / ***検証文字のy軸値は、並列性のために値が同じであるため、検証文字のy軸値*/ private int codey; / *** CodeSequenceは、文字が表示されるシーケンス値を表します*/ char [] codesequence = {'a'、 'b'、 'c' '、' d '、' e '、' f '、g'、 'h'、 ''、 'i' '' '' 'v'、 'w'、 'x' '、' y '、' z '、' 0 '、' 1 '、' 2 '、' 3 '、' 4 '、' 5 '、' 6 '、' 7 '、' 8 '9'}; / ***検証画像属性の初期化*/ public void init()throws servletexception {// web.xml // width string strwidth = this.getinitParameter( "width"); // height string strheight = this.getInitParameter( "height"); //文字列文字列strcodecount = this.getInitParameter( "codecount"); //構成された情報を数値に変換します{if(strwidth!= null && strwidth.length()!= 0){width = integer.parseint(strwidth); } if(strheight!= null && strheight.length()!= 0){height = integer.parseint(strheight); } if(strcodecount!= null && strcodecount.length()!= 0){codecount = integer.parseint(strcodecount); }} catch(numberformatexception e){e.printstacktrace(); } // width-4冗長な左と右の位置を削除して、検証コードをより集中させ、それを減らすほど濃縮されます。 // codecount+1 //左側と右側のスペースを含む表示された幅のequi-variant割り当てcodex =(width-4) /(codecount+1); //高さ-10中央表示検証コードfontheight = height -10; codey = height -7; } / ** * @param request * @param Response * @throws servletexception * @throws java.io.ioexception * / protected void service(httpservletrequest request、httpservletresponse応答)スローServletexception、java.io.ioexception {// refine bufferedimage bufferedage bufferedimg = define bufferedage bufferimg = define bufferedage buffimg bufferedimage.type_int_rgb); graphics2d gd = buffimg.creategraphics(); //ランダム数ジェネレータークラスの作成ランダム= new Random(); //画像をWhite Gd.setColor(color.light_gray)として記入します。 gd.fillrect(0、0、幅、高さ); //フォントを作成するには、フォントのサイズを画像の高さに応じて決定する必要があります。 font font = new font( "sixedsys"、font.plain、fontheight); //フォントを設定します。 gd.setfont(font); //境界線を描きます。 gd.setcolor(color.black); gd.drawrect(0、0、width -1、height -1); // 160の干渉線をランダムに生成し、画像内の認証コードを他のプログラムで検出する可能性が低くなります。 gd.setcolor(color.gray); for(int i = 0; i <16; i ++){int x = random.nextint(width); int y = random.nextint(height); int xl = random.nextint(12); int yl = random.nextint(12); gd.drawline(x、y、x + xl、y + yl); } //ランダムコードは、ランダムに生成された検証コードを保存するために使用され、ユーザーがログイン後に確認できるようにします。StringBufferRandomCode= new StringBuffer(); int red = 0、緑= 0、青= 0; // CodeCount番号の検証コードをランダムに生成します。 for(int i = 0; i <codecount; i ++){//ランダムに生成された検証コード番号を取得します。 string strrand = string.valueof(codesequence [random.nextint(36)]); //ランダムな色のコンポーネントを生成して、各数字出力の色値が異なるように色値を構築します。 red = random.nextint(255); green = random.nextint(255); blue = random.nextint(255); //ランダムに生成された色で検証コードを画像に描画します。 gd.setcolor(新しい色(赤、緑、青)); gd.drawstring(strrand、(i + 1) * codex、codey); //生成された4つの乱数を一緒に結合します。 randomcode.append(strrand); } //セッションに4桁の検証コードを保存します。 httpsession session = request.getSession(); session.setattribute( "validatecode"、randomcode.tostring()); //画像キャッシュは禁止されています。 Response.setheader( "Pragma"、 "no-cache"); Response.setheader( "Cache-Control"、 "no-cache"); Response.setDateHeader( "Expires"、0); Response.setContentType( "Image/jpeg"); //画像をサーブレット出力ストリームに出力します。 ServletOutputStream SOS = Response.GetOutputStream(); Imageio.write(buffimg、 "jpeg"、sos); sos.close(); }}次に、次のように、Web.xmlで検証コードを生成するこのサーブレットを構成します。
<Servlet> <Servlet-Name> verifyCodeServlet </servlet-name> <servlet-class> com.servlet.verifycodeservlet </servlet-class> <init-param> <param-name> width </param-name> <param-value> 120 </param-value> </init-param> <init-param> <init-param> <init-param> <init-param> <param-value> 32 </param-value> </init-param> <init-param> <param-name> codecount </param-name> <param-value> 4 </param-value> </init-param> </servlet> <サーブレットマッピング> <servet-name> servet-name> verifycodeservlet </servlet-name> <ur-pertern> <ur-pertern> </サーブレットマッピング>
サーバーを起動し、ブラウザアドレスバーに入力します:http:// localhost:8080/webproject/verifycodeservlet
次のように、ディスプレイ効果を確認してください。
1.検証コードは、ブラウザキャッシュを無効にするサーブレットが設定されているため、検証コードを更新するたびに変更されます。
2。ここで問題が見つかりました:Firefoxブラウザを使用すると、verifyCodeServletの書き換えられたサービス方法が2回実行されており、DoGetメソッドまたはDoPostメソッドを書き直す場合も同じことが言えます。他のブラウザはこの状況を見ません。後で、サーブレットがページから参照されている場合、それを呼び出すのは正常であることがわかりました。
次に、ページ上の検証コードを参照できます。特定のコードは次のとおりです。
<%@ page Language = "Java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! <html> <head> <Meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title>挿入タイトル</title> </head> </head> <body> string verifycode =(string)session.getAttribute( "validatecode"); if(inputCode!= null && verifyCode!= null){out.print( "real visification code:" + verifyCode + "<br/>" + "ユーザー入力検証コード:" + inputCode + "<br/>"); inputCode = inputCode.touppercase(); // Case Insensitive Out.print( "検証コードを比較してユーザー入力を証明します" +(inputCode.equals(verifyCode)? "recort": "error") + "!"); }%> <form action = "index.jsp">検証コード:<input name = "inputcode" value = ""/> <img src = "verifycodeservlet" align = "middle" onclick = "javascript:refresh(this);" onMouseOver = "MouseOver(this)"/> <br/> <input name = "submit" type = "submit" value = "submit"/> </form> </div> <script> function refresh(obj){obj.src = "verifyCodeservlet?" + math.random(); } function mouseover(obj){obj.style.cursor = "pointer"; } </script> </body> </html>上記のコードは、フォームを介して現在のJSPに検証コードを提出して、ユーザーが入力した検証コードが正しいかどうかを確認します。操作の特定の効果は次のとおりです。
1.正しい検証コードを入力します
2。誤った検証コードを入力します