1. Vorwort
Der Vorteil der Verwendung von Verifizierungscodes auf Formularseiten besteht darin, dass Benutzer effektiv daran gehindert werden, böswillig Formulare einzureichen oder Plug-Ins zu verwenden, um das System illegal anzugreifen.
2. Vorbereitungsbedingungen
1. Ein normales Webprojekt -Webprojekt;
2. Ein Webserver -Tomcat.
3.. Implementierungsideen:
1. Passen Sie ein Servlet verififyCodeServlet an, um ein Verifizierungscode -Bild zu zeichnen, das Verifizierungszeichen enthält. Die Bilder hier müssen manuell mit Graphics2D gezeichnet werden.
2. Verwenden Sie das SRC des IMG -Tags, um dieses Servlet auf der spezifischen Seite zu verweisen, um das Servlet anzuzeigen.
3. Da die Verifizierungscodeinformationen beim Zeichnen des Bildes nach dem Senden des Formulars in die Sitzung eingefügt werden, können Sie den in der Sitzung gespeicherten Wert mit dem vom Benutzer eingegebenen Code vergleichen, um zu überprüfen, ob die Eingabe korrekt ist.
Die meisten Überprüfungscodes, die über Servlets implementiert werden, werden online implementiert, und die folgende Logik ist eingegeben:
Schritt:
1. Generieren Sie nach dem Zufallsprinzip Verifizierungscode -Zeichenfolgen bei der Anmeldung bei der Seite;
2. Speichern Sie die generierte Verifizierungscodezeichenfolge in der Sitzung;
A. Generieren Sie den Verifizierungscode -Bildern basierend auf der Verifizierungscode -Zeichenfolge und geben Sie dann die zum Anzeigen des Kunden angezeigten Bestätigungscode -Bilder aus.
V.
4. Der spezifische Code lautet wie folgt:
Paket com.servlet; Import Java.awt.Color; import Java.awt.font; Import Java.awt.Graphics2d; Import Java.awt.image.BuffenedImage; import Java.util.random; import Javax.imageo.imageo; importieren javax.servlet.servletException; Importieren Sie javax.servlet.servletoutputStream; import Javax.servlet.http.httpServlet; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; import Javax.servlet.http.httpSession; / ** * Servlet, das Verifizierungscode -Bild erzeugt * @Author Administrator * * */ Public Class VerifyCodeServlet erweitert HttpServlet {private statische endgültige lange Serialversionuid = -505109752828603895L; /*** Breite des Verifizierungscodebildes. */ private int width = 100; /*** Die Höhe des Verifizierungscodebildes. */ private int Höhe = 30; / *** Anzahl der Verifizierungscodezeichen*/ private int codeCount = 4; / *** Schrifthöhe*/ privat int fontheight; / *** Der x-Achsenwert des ersten Zeichens, da die Koordinaten der folgenden Zeichen nachgedacht sind, ist ihr X-Achsenwert ein Vielfaches von Codex*/ privat int Codex; / *** Codey, der y-Achsenwert des Verifizierungszeichens, da die Werte aufgrund der Parallelität*/ privat int codey gleich sind; / *** Codesequence repräsentiert den Sequenzwert, den die Zeichen erscheinen dürfen 'V', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** Initialisieren Sie das Überprüfungsbild -Attribut*/ public void init () löscht servleTexception {// Erste Informationen von web.xml // Breite String strWidth = this.getInitParameter ("width") aus. // Höhe String strHeight = this.getInitParameter ("Höhe"); // Anzahl der Zeichen String StrCodeCount = this.getInitParameter ("CodeCount"); // Die konfigurierten Informationen in einen numerischen Versuch konvertieren {if (strWidth! = Null && strwidth.length ()! = 0) {width = integer.parseInt (strWidth); } if (strHeight! = null && strHeight.length ()! } if (strCodeCount! = null && strCodeCount.length ()! }} catch (numberFormatexception e) {e.printstacktrace (); } // Width-4 Entfernen Sie die redundanten linken und rechten Positionen, um den Verifizierungscode konzentrierter zu gestalten, und je mehr Sie ihn reduzieren, desto konzentrierter ist er. // CodeCount+1 // gleichvariante Zuordnung der angezeigten Breite, einschließlich Leerzeichen auf der linken und rechten Seite Codex = (Width-4) /(CodeCount+1); // Höhe - 10 zentraler Überprüfungscode fontHeight = Höhe - 10; Codey = Höhe - 7; } / ** * @param request * @param response * @throwservletException * @throws java.io.ioException * / Protected void Service (httpServletRequest Request, httpServletresponse -Antwort) löst ServletException, Java.io.ioxception {// Define Imbuledimg -Buffere Bufferedimg = News Bufferedimg = News BufferedimG = New Newage BuffimG = New Newage BuffimG = New Newage BuffimG = New Newage Buffimage, Height. Bufferedimage.type_int_rgb); Graphics2d GD = buffimg.CreateGraphics (); // Erstellen Sie eine zufällige Zahlengeneratorklasse Random Random = New Random (); // das Bild als weiße GD.SetColor (color.light_gray) füllen; Gd.FillRect (0, 0, Breite, Höhe); // Erstellen Sie eine Schriftart, die Größe der Schrift sollte gemäß der Höhe des Bildes bestimmt werden. Schriftart = neuer Schrift ("FixedSys", font.plain, fonttheight); // Setzen Sie die Schriftart. gd.setfont (Schriftart); // Grenzen zeichnen. gd.setColor (color.black); Gd.Drawrect (0, 0, Breite - 1, Höhe - 1); // Generieren Sie zufällig 160 Interferenzleitungen, wodurch der Authentifizierungscode im Bild weniger wahrscheinlich von anderen Programmen erkannt wird. gd.setColor (color.gray); für (int i = 0; i <16; i ++) {int x = random.nextint (width); int y = random.nextint (Höhe); int xl = random.nextint (12); int yl = random.nextint (12); gd.drawline (x, y, x + xl, y + yl); } // RandomCode wird verwendet, um zufällig generierte Verifizierungscodes zu speichern, damit der Benutzer nach der Anmeldung einsetzt. StringBuffer randomCode = new StringBuffer (); int rot = 0, grün = 0, blau = 0; // generiert zufällig einen Verifizierungscode für die CodeCount -Nummer. für (int i = 0; i <CodeCount; i ++) {// Erhalten Sie die zufällig generierte Verifizierungscodenummer. String strrand = string.ValueOf (codesquence [random.nextint (36)]); // Erzeugen Sie zufällige Farbkomponenten, um den Farbwert zu konstruieren, damit der Farbwert jeder Ziffernausgabe unterschiedlich ist. rot = random.nextint (255); grün = random.nextint (255); Blue = random.Nextint (255); // Zeichnen Sie den Verifizierungscode mit der zufällig generierten Farbe in das Bild. gd.setColor (neue Farbe (rot, grün, blau); gd.drawstring (Strrand, (i + 1) * codex, cody); // Kombinieren Sie die erzeugten vier zufälligen Zahlen miteinander. randomCode.append (Strrand); } // Speichern Sie den vierstelligen Überprüfungscode in der Sitzung. HttpSession Session = Request.GetSession (); Session.SetAttribute ("validateCode", randomCode.toString ()); // Image -Cache ist verboten. response.setheader ("pragma", "no-cache"); response.setheader ("cache-control", "no-cache"); response.setDateHeader ("läuft", 0); Antwort.SetContentType ("Image/JPEG"); // Ausgabe des Bildes in den Servlet -Ausgangsstrom ausgeben. ServletoutputStream sos = response.getOutputStream (); Imageio.Write (Buffimg, "JPEG", SOS); sos.close (); }}Konfigurieren Sie dann dieses Servlet, das den Verifizierungscode in web.xml generiert, wie folgt:
<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> <param-name>height</param-name> <param-value> 32 </param-value> </init-param> <init-param> <param-name> codeCount </param-name> <param-value> 4 </param-value> </init-param> </servlet> <Servlet-Mapping> <servlet-name> versifyCodeServlet </servlet-name> <URL-Muster>/VerifyCodeServlet </url-pattern> </Servlet-Mapping>
Starten Sie den Server und geben Sie in die Browser -Adressleiste ein: http: // localhost: 8080/webproject/verifyCodeServlet
Überprüfen Sie den Anzeigeffekt wie folgt:
1. Der Verifizierungscode ändert sich jedes Mal, wenn Sie den Bestätigungscode aktualisieren, da das Servlet so eingestellt ist, dass der Browser -Cache deaktiviert wird.
2. Es wurde hier ein Problem gefunden: Wenn Sie den Firefox -Browser verwenden, wurde die umgeschriebene Servicemethode in VerifyCodeServlet zweimal ausgeführt, und das gleiche gilt, wenn Sie die DoGet -Methode oder Dopost -Methode neu schreiben. Und andere Browser sehen diese Situation nicht. Später wurde festgestellt, dass es normal wäre, wenn das Servlet über die Seite verwiesen würde, es normal wäre, es zu nennen.
Anschließend können Sie auf den Verifizierungscode auf der Seite verweisen. Der spezifische Code lautet wie folgt:
<%@ page Language = "java" contentType = "text/html; charset = utf-8" pageCoding = "utf-8"%> <! docType html public "-// w3c // dtd html 4.01 transitional // en" http://www.w.w.w.w.w.w.w.w.w3. <html> <kopf> <meta http-äquiv = "content-type" content = "text/html; charSet = iso-8859-1"> <title> Title hier einfügen </title> </head> <body> <div> <% String InputCode = Anfrage.getParameter ("InputCode"); String verifyCode = (string) session.getAttribute ("validateCode"); if (inputcode! = null && verifyCode! inputcode = inputCode.touppercase (); // case unempfindlich out.print ("Verifizierungscode vergleiche, um die Benutzereingabe zu beweisen" + (inputCode.equals (verifyCode)? "Richtig": "Fehler") + "!"); } %> <form action = "index.jsp"> Verifizierungscode: <input name = "inputCode" value = ""/> <img src = "verifyCodeServlet" align = "Middle" Onclick = "JavaScript: aktualisieren (this);" onmouseover = "Mausover (this)"/> <br/> <Eingabe name = "enden" type = "sure" value = "subieren"/> </form> </div> <script> Funktion refresh (obj) {obj.src = "verifyCodeServlet?" + Math.random (); } function mouseover (obj) {obj.style.cursor = "pointer"; } </script> </body> </html> Der obige Code leistet den Überprüfungscode über das Formular dem aktuellen JSP über das Formular, um zu überprüfen, ob der vom Benutzer eingegebene Bestätigungscode korrekt ist. Der spezifische Effekt der Operation ist wie folgt:
1. Geben Sie den richtigen Verifizierungscode ein
2. Geben Sie den falschen Verifizierungscode ein