1. Préface
L'avantage de l'utilisation des codes de vérification dans les pages de formulaire est qu'il empêche efficacement les utilisateurs de soumettre des formulaires de manière malveillante ou d'utiliser des plug-ins pour attaquer illégalement le système.
2. Conditions de préparation
1. Un projet WebProject du projet Web normal;
2. Un serveur Web Tomcat.
3. Idées de mise en œuvre:
1. Personnalisez un servlet VerifyCodeServlet pour dessiner une image de code de vérification contenant des caractères de vérification. Les images ici doivent être dessinées manuellement à l'aide de Graphics2D;
2. Utilisez le SRC de la balise IMG pour référencer ce servlet sur la page spécifique pour afficher le servlet;
3. Étant donné que les informations du code de vérification sont placées dans la session lors du dessin de l'image, après avoir soumis le formulaire, vous pouvez comparer la valeur enregistrée dans la session avec le code entré par l'utilisateur pour vérifier si l'entrée est correcte.
La plupart des codes de vérification implémentés via des servlets sont implémentés en ligne, et la logique ci-dessous est entrée:
étape:
1. Générer au hasard les chaînes de code de vérification lors de la demande de connexion à la page;
2. Stockez la chaîne de code de vérification générée dans la session;
3. Générez des images de code de vérification basées sur la chaîne de code de vérification, puis publiez les images de code de vérification au client à afficher;
4. Comparez la chaîne de code de vérification entrée par l'utilisateur lors de la soumission de la demande de connexion avec la chaîne dans la session.
4. Le code spécifique est le suivant:
Package com.servlet; import java.awt.color; Importer java.awt.font; import java.awt.graphics2d; Importer java.awt.image.bufferedImage; import java.util.random; import javax.imageio.imageio; Importer javax.servlet.servletException; Importer javax.servlet.servletOutStream; import javax.servlet.http.httpservlet; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; Importer javax.servlet.http.httpSession; / ** * Servlet qui génère l'image du code de vérification * @Author Administrator * * / public class VerifyCoDeservlet étend httpServlet {private static final SerialVersionUID = -5051097528828603895l; / ** * Largeur de l'image de code de vérification. * / private int largeth = 100; / ** * La hauteur de l'image du code de vérification. * / private int hauteur = 30; / ** * Nombre de caractères de code de vérification * / private int codeCount = 4; / ** * Hauteur de police * / private int fonteight; / ** * La valeur de l'axe X du premier caractère, car les coordonnées des caractères suivantes sont incrémentées en séquence, leur valeur de l'axe X est un multiple de codex * / private intdex; / ** * Codey, la valeur de l'axe y du caractère de vérification, car les valeurs sont les mêmes en raison du parallélisme * / private int codey; / ** * CodeeSequence représente la valeur de séquence que les caractères sont autorisés à apparaître * / char [] codeeSequence = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm' «V», «W», «X», «Y», «Z», «0», «1», «2», «3», «4», «5», «6», «7», «8», «9»}; / ** * Initialiser l'attribut d'image de vérification * / public void init () lève Servlexception {// obtenir des informations initiales sur web.xml // width String strwidth = this.getInitAramètre ("width"); // chaîne de hauteur strheight = this.getInitParameter ("hauteur"); // Nombre de caractères string strCodeCount = this.getInitParameter ("CodeCount"); // convertit les informations configurées en un essai numérique {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 (); } // Largeur-4 Retirez les positions redondantes gauche et droite pour rendre le code de vérification plus concentré, et plus vous le réduisez, plus il est concentré. // CodeCount + 1 // Allocation Equi-Variant de la largeur affichée, y compris les espaces sur les côtés gauche et droit Codex = (largeur-4) / (CodeCount + 1); // Hauteur - 10 Afficher le code de vérification centralement Fontheight = Height - 10; Codey = hauteur - 7; } / ** * @param demande * @param réponse * @throws servlexception * @throws java.io.ioException * / Protected void Service (HttpservletRequest, HttpServletResponse Response) lance Servlexception, java.io.ioexception {// Define Image Buffer BuffredImage Buffimg = BufferedImage.Type_int_rgb); Graphics2d GD = BuffImg.CreateGraphics (); // Créer une classe de générateur de nombres aléatoires aléatoire aléatoire = new random (); // remplit l'image en tant que blanc gd.setColor (colore.light_gray); gd.fillrect (0, 0, largeur, hauteur); // Créez une police, la taille de la police doit être déterminée en fonction de la hauteur de l'image. FONT FONT = NOUVEAU FONT ("Fixys", Font.Plain, Fontheight); // Définissez la police. gd.setfont (font); // dessine des frontières. gd.setColor (color.black); gd.Drawrect (0, 0, largeur - 1, hauteur - 1); // Générer au hasard 160 lignes d'interférence, ce qui rend le code d'authentification dans l'image moins susceptible d'être détecté par d'autres programmes. gd.setColor (color.gray); pour (int i = 0; i <16; i ++) {int x = random.nextint (largeur); int y = random.nextint (hauteur); int xl = random.nextint (12); int yl = random.nextint (12); gd.Drawline (x, y, x + xl, y + yl); } // RandomCode est utilisé pour enregistrer des codes de vérification générés de manière aléatoire afin que l'utilisateur puisse vérifier après la connexion. StringBuffer randomcode = new StringBuffer (); int rouge = 0, vert = 0, bleu = 0; // génère au hasard un code de vérification pour le numéro de codeCount. for (int i = 0; i <codeCount; i ++) {// Obtenez le numéro de code de vérification généré au hasard. String strrand = string.valueof (CodeeSequence [random.nextint (36)]); // Générez des composants de couleur aléatoires pour construire la valeur de couleur, de sorte que la valeur de couleur de chaque sortie de chiffre sera différente. rouge = random.nextint (255); vert = random.nextint (255); bleu = random.nextint (255); // Dessinez le code de vérification dans l'image avec la couleur générée aléatoirement. gd.setColor (nouvelle couleur (rouge, vert, bleu)); gd.Drawstring (strrand, (i + 1) * Codex, Codey); // Combinez les quatre nombres aléatoires générés ensemble. randomcode.append (strrand); } // Enregistrez le code de vérification à quatre chiffres à la session. HttpSession session = request.getSession (); session.setAttribute ("validatecode", randomcode.toString ()); // Le cache d'image est interdit. Response.sethEader ("Pragma", "No-Cache"); Response.sethEader ("Cache-Control", "No-cache"); réponse.setDateHeader ("expire", 0); réponse.setContentType ("Image / JPEG"); // Sortie de l'image vers le flux de sortie du servlet. ServletOutputStream sos = réponse.getOutputStream (); ImageIo.write (Buffimg, "JPEG", SOS); sos.close (); }}Configurez ensuite ce servlet qui génère du code de vérification dans web.xml, comme suit:
<VerTlet> <Serplet-Name> VerifyCoDerServlet </ Servlet-Name> <Servlet-Class> com.servlet.verifycodeservlet </ servlet-Class> <Init-Param> </ Param-Name> Width </ Param-name> <Anit-Value> 120 </ Param-Value> </Init-Param> <Init-Param> <param-valeur> 32 </ param-valeur> </ init-param> <init-param> <param-name> codeCount </ param-name> <param-value> 4 </ param-value> </ init-param> </ servlet> <servlet-mapping> <servlet-name> VerifyCoDerSert </servlet-name> <URL-Pattern> / VerifyCoDeservlet </ URL-Pattern> </ Servlet-Mapping>
Démarrez le serveur et entrez dans la barre d'adresse du navigateur: http: // localhost: 8080 / webproject / Verifycodeservlet
Vérifiez l'effet d'affichage, comme suit:
1. Le code de vérification change chaque fois que vous actualisez le code de vérification, car le servlet a défini pour désactiver le cache du navigateur.
2. Un problème a été trouvé ici: si vous utilisez Firefox Browser, la méthode de service réécrite dans VerifyCoDerServlet a été exécutée deux fois, et il en va de même si vous réécrivez la méthode DoGet ou la méthode DOPOST. Et d'autres navigateurs ne voient pas cette situation. Plus tard, il a été constaté que si le servlet était référencé via la page, il serait normal de l'appeler.
Ensuite, vous pouvez référencer le code de vérification sur la page, le code spécifique est le suivant:
<% @ Page Language = "Java" ContentType = "Text / Html; charSet = UTF-8" Pageencoding = "UTF-8"%> <! Doctype HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // En" "http://www.w3.org/tr/html4/loose" <Html> <A-head> <meta http-equiv = "contenu-type" contenu = "text / html; charset = iso-8859-1"> <ititle> insérer le titre ici </ title> </ head> <body> <div> <% String inputCode = request.getParameter ("InputCode"); String vérifieycode = (string) session.getAttribute ("validatecode"); if (inputCode! = null && VerifyCode! = null) {out.print ("Code de vérification réel:" + VerifyCode + "<br/>" + "Code de vérification de l'entrée utilisateur:" + InputCode + "<br/>"); inputCode = inputCode.ToupperCase (); // Case insensitive out.print ("Comparez le code de vérification pour prouver l'entrée de l'utilisateur" + (inputCode.equals (VerifyCode)? "Correct": "Error") + "!"); }%> <form action = "index.jsp"> Code de vérification: <input name = "inputcode" value = "" /> <img src = "VerifyCoDeservlet" align = "midd" onClick = "javascript: refresh (this);" onMouseOver = "Mouseover (this)" /> <br/> <input name = "soume" type = "soumi" value = "soumi" /> </ form> </div> <cript> function refresh (obj) {obj.src = "VerifyCodeServlet?" + Math.random (); } fonction MouseOver (obj) {obj.style.cursor = "pointeur"; } </ script> </ body> </html> Le code ci-dessus soumet le code de vérification au JSP actuel via le formulaire pour vérifier si le code de vérification entré par l'utilisateur est correct. L'effet spécifique de l'opération est le suivant:
1. Entrez le code de vérification correct
2. Entrez le mauvais code de vérification