1。基本プロセス:
フォームに[検証コード]ページ(非常に小さい)→[非常に小さい)→[ページ]に埋め込まれて、[ページを更新]→[フォームの送信時に確認します。
2。方法:
1.テスタcを定義し、描画方法を実装します
パッケージcom.zhuguang.action; java.awt.colorをインポートします。 java.awt.fontをインポートします。 java.awt.graphicsをインポートします。 java.awt.image.bufferedimageをインポートします。 java.util.mapをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 org.apache.struts2.interceptor.servletResponseawareをインポートします。 Import org.apache.struts2.interceptor.sessionaware; com.opensymphony.xwork2.actionsupportをインポートします。 com.sun.image.codec.jpeg.jpegcodecをインポートします。 com.sun.image.codec.jpeg.jpegimageencoderをインポートします。 Public Class Testactionは、ActionSupportを実装し、SersipleTresponseaware {private Map <String、object> session;プライベートHTTPSERVLETRESPONSE応答。 private static final long serialversionuid = 1l;プライベートストリングchknumber; @Override public String execute()throws Exception {response.setheader( "cache-control"、 "no-cache"); int width = 50; //画像幅int height = 20; //画像高さbufferedimage画像= new bufferedimage(幅、高さ、bufferedimage.type_int_rgb); Graphics Graphics = image.creategraphics(); Graphics.setColor(this.getColor()); //背景カラーグラフィックスフィルレクト(0、0、幅、高さ); graphics.setfont(new Font( "arial"、font.bold、18)); Graphics.setColor(this.getColor()); //単語の文字列番号= string.valueof(system.currenttimemillis()%9000+1000)の色; // 4ビットの乱数セッションを生成します。 //セッショングラフィックスに書き込みます。DrawString(number、(int)(width*0.1)、(int)(height*0.8)); graphics.dispose(); jpegimageencoder encoder = jpegcodec.createjpegencoder(respons.getOutputStream()); encoder.encode(画像); Response.getOutputStream()。flush(); //ページに更新して、画像Response.getOutputStream()。close()を生成します。 // close writer return null; } private color getColor(){int red =(int)(math.random()*1000%256); int green =(int)(math.random()*1000%256); int blue =(int)(math.random()*1000%256);新しい色(赤、緑、青)を返します。 } public string getChknumber(){return chknumber; } public void setChnumber(string chknumber){this.chknumber = chknumber; } @Override public void setSession(map <string、object> session){// todo auto-enerated method stub this.session = session; } @Override public void setSession(map <string、object> session){// todo auto-enerated method stub this.session = session; } @Override public void setServletResponse(httpservletResponse Response){// todo auto-eneratedメソッドスタブthis.response = response; }}セッションと応答の使用に注意してください
2。struts.xmlファイルに登録してください:
<アクションname = "randomcode"> </action>
ページがリダイレクトされないように、情報は返されません
3。JSSPページの書き込み
<%@ページ言語= "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <%@ taglib uri = "/struts-tags" prefix = "s" s " string basepath = request.getscheme()+"://"+request.getServername()+":"+request.getServerport()+path+"/"; %> <!doctype html public " - // w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv = "content-type" contep-type "/"/"/utpe"/ <script type = "text/javascript"> <! - function reloadcode(obj、base){var rand = new date()。getTime(); //現在の時刻は、URLのパラメーターとして使用されてURLを変更するため、検証コードが動的にロードされます。 //それは単なる干渉効果であり、意味がありませんが、非常に賢いです。 haha obj.src = base+"randomcode.action?abc ="+rand; //実際、サーバー側にABCフィールドはありません。 } // - > </script> <title>テストページ</title> </head> <body> <form action = "testlogin" method = "post"> username <input opt = "text" name = "name"> <br> password <input opy = "text" name = "password"> <br> verification code:<input typen src = "<%= basepath%> randomcode.action" id = "safecode" onclick = "reloadcode(this、 '<%= basepath%>')"/> <br> <入力タイプ= "value =" loginin "> </form> </body> </html>4。検証
(1)実行中の検証方法を追加します
public string testlogin(){if(session.get( "randomcode")。equals(chknumber)){return success; } else {return error; }}(2)struts.xmlに登録します
<アクションname = "testlogin" method = "testlogin"> <result name = "success"> success.jsp </result name = "error"> error.jsp </result> </action>
上記は、編集者が動的検証コードを生成してサンプルコードを検証するために紹介したStruts2の実装です。私はそれが誰にでも役立つことを願っています!