Étapes de génération d'images de code de vérification
Créez un objet BufferedImage.
Obtenez le pinceau du tampon de tampon, c'est-à-dire appeler la méthode getGraphics () pour obtenir l'objet graphique.
Appelez la méthode setColor () et FillRect () de l'objet graphique pour définir la couleur d'arrière-plan de l'image.
Appelez la méthode setColor () et la méthode Drawline () de l'objet graphique pour définir la ligne d'interférence de l'image.
Appelez la méthode setrgb () de l'objet BufferedImaged pour définir le bruit de l'image.
Appelez la méthode setColor (), la méthode setfont () et la méthode drawstring () de l'objet graphique pour définir le code de vérification d'image.
Étant donné que la largeur et la hauteur de l'image du code de vérification doivent être déterminées en fonction du style du site Web, la taille de la police doit être déterminée en fonction de la largeur et de la hauteur de l'image, et une petite compétence est utilisée.
package util; importer java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image; import java.awt.image.bufferedImage; import java.io.bytearrayoutputStream; import java.ioexect; import java.utitil.random; import java.ioexect; import java.utitil.random; import java.ioexect; import Java. javax.imageio.imageio; Vérification de classe publique {chaîne finale statique privée alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890"; / ** * générer une image avec la largeur comme largeur, hauteur comme hauteur et code de vérification comme code * @param largeur la largeur de l'image * @param hauteur de la hauteur de l'image * @param code de code de vérification String * @return return Image Code * / public static BufferedImage getImage (int, width); } / ** * générer une largeur en largeur, hauteur comme hauteur, le code de vérification est un code, le nombre de lignes d'interférence dans l'image est linécnt * @param width String * @param linecnt le nombre de lignes d'interférence, il est recommandé de remettre à la verrou Code * / public static bufferedImage getImage (int largeur, height int, code de chaîne, int linecnt) {return createImage (largeur, hauteur, code, linecnt, 0,01); } / ** * Générer une image avec la largeur, la hauteur, la hauteur et le code de vérification est le code, le nombre de lignes d'interférence dans l'image est linecnt * Le rapport de bruit est nuits, c'est-à-dire le pourcentage de pixels de bruit dans l'image * @param largeur la largeur de l'image * @param hauteur de la hauteur de l'image * @param code de code chaîne * @param linecnt Il est approprié en fonction des résultats * @param notez le pourcentage de pixels de bruit dans l'image sur les pixels totaux * @return Renvoie le code de vérification d'image * / public static BufferedImage getImage (int larget, int hauteur, code de chaîne, int linecnt, double noserate); } / ** * * Générez une image avec une largeur, une hauteur et un code de vérification. Le nombre de lignes d'interférence dans l'image est linécnt * Le rapport de bruit est nuiseté, c'est-à-dire le pourcentage de pixels de bruit dans l'image * @param largeur String * @param linecnt Le nombre de lignes d'interférence est recommandée à environ 10, et peut être ajustée de manière appropriée selon les résultats * Image à Total Pixels * @return Renvoie le code de vérification d'image * / Private Static BufferedImage CreateImage (Int Width, int Height, String Code, int linecnt, double thiserate) {int fontwidth = ((int) (width * 0.8)) / code.length (); int fonteight = (int) (hauteur * 0,7); // Afin de générer de bons codes de vérification sous n'importe quelle largeur et hauteur, // la taille du Fontwdith est la plus petite en fonte, int fontsize = math.min (FontWidth, fonTheight); // int paddingx = (int) (largeur * 0,1); int paddingy = hauteur - (hauteur - fontsize) / 2; // Créer une image BufferedImage BuffImg = new BufferedImage (largeur, hauteur, bufferedImage.type_int_rgb); // Obtenez des graphiques de pinceau g = buffMImg.getGraphics (); // définit la couleur du pinceau g.setColor (getrandcolor (200, 255)); // remplissez ensuite un rectangle, c'est-à-dire définir la couleur d'arrière-plan g.filrect (0, 0, largeur, hauteur); // Définissez la ligne d'interférence pour (int i = 0; i <linecnt; i ++) {// Store pour obtenir les points de départ et de fin de la ligne d'interférence int xs = (int) (math.random () * largeur); int ys = (int) (math.random () * hauteur); int xe = (int) (math.random () * largeur); int ye = (int) (math.random () * hauteur); g.setColor (getrandColor (1, 255)); G.Drawline (XS, YS, XE, YE); } // Ajouter un bruit int aire = (int) (noblerate * largeur * hauteur); pour (int i = 0; i <zone; ++ i) {int x = (int) (math.random () * largeur); int y = (int) (math.random () * hauteur); Buffimg.setrgb (x, y, (int) (math.random () * 255)); } // Set Font font font font Font = new Font ("Ravie", font.plain, FonTSize); g.setfont (police); pour (int i = 0; i <code.length (); ++ i) {String ch = code.substring (i, i + 1); g.setColor (getrandcolor (1, 199)); G.Drawstring (Ch, PaddingX + FontWidth * I, Paddingy); } return buffimg; } / ** * Obtenez la couleur aléatoire, les valeurs de R, G, B sont entre L et R * @param L Intervalle gauche * @param r intervalle droit * @return Renvoie la valeur de couleur aléatoire * / couleur statique privée getrandColor (int l, int r) {if (l> 255) l = 255; if (r> 255) r = 255; if (l <0) l = 0; if (r <0) r = 0; int interval = r - l; int r = l + (int) (math.random () * interval); int g = l + (int) (math.random () * interval); int b = l + (int) (math.random () * interval); retourner une nouvelle couleur (r, g, b); } / ** * Générez de manière aléatoire plusieurs chaînes composées de lettres et de nombres en majuscules et en minuscules * @param Len génère aléatoirement les caractères LEN * @return renvoie une chaîne générée aléatoirement composée de lettres et de nombres en majuscules * / public static getrandcode (int len) {String code = ""; pour (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alphabet.length ()); code = code + alphabet.charat (index); } return code; } / ** * Convertir l'image en tableau d'octets * @param image image * @return renvoie le tableau d'octet * @throws ioException * / public static byte [] getByTearray (BufferedImage Image) lève ioException {bytearrayOutputStream baos = new ByteArrayOutStream (); Imageo.write (image, "png", baos); return baos.toByteArray (); // bytearrayoutputStream ne nécessite pas de fermeture}}Utiliser l'image du code de vérification
Dans le servlet VerificationCode.java, appelez la classe ci-dessus pour générer l'image de code de vérification, puis renvoyez l'image au client.
Protected void doGet (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {httpSession session = request.getSession (); // Générez un code de chaîne de session et écriture au hasard = Verification.getRandcode (4); session.setAttribute ("Vérification", code); BufferedImage Image = util.Verification.getImage (100,30, code, 5); réponse.setContentType ("image / png"); OutputStream out = réponse.getOutputStream (); out.write (util.Verification.getByTearray (image)); out.flush (); out.close (); }Définissez le code de vérification dans index.jsp. Lorsque l'utilisateur clique sur le code de vérification, il appelle le code JS pour demander au serveur d'obtenir le nouveau code de vérification. Étant donné que le servlet ci-dessus qui génère le code de vérification sera mis en cache par le navigateur, le code JS doit donner au servlet un paramètre aléatoire, afin que le navigateur envoie une demande au serveur pour obtenir un nouveau code de vérification, plutôt que de le lire dans le cache.
<% @ page import = "util.Verification"%> <% @ page linguisse = "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.dtd"><html><head><meta http-equiv =" contenu-type "contenu =" Text / html; charset = utf-8 "> <tapie> inserter le titre de réfresque </ title> document.getElementById ("Vérification"). Src = "/ VerificationCode / VerificationCode? hehe =" + math.random (); } </script></head><body> <form action="<%=request.getContextPath()+"/checkVerification" %>" method="post"> Verification code:<input type="text" name="submitVerification"> <img id="verification" src="<%=request.getContextPath()+"/verificationCode" %>" onclick="refreshcode()"><br> <input type = "soumi" name = "soumi" value = "soumi"> </ form> </ body> </html>Enfin, dans le servlet CheckVerification.java, nous déterminons si le code de vérification entré par l'utilisateur est correct. Afin de faciliter les utilisateurs, le code de vérification est généralement défini comme insensible à la casse, il doit donc être converti en lettres minuscules avant la comparaison.
Protected void doGet (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {httpSession session = request.getSession (); String vérification = (String) session.getAttribute ("Vérification"); String soumedverification = request.getParameter ("SoumideVerification"); Printwriter out = réponse.getWriter (); if (Verification! = null && SoumisVerification! = null) {if (vérification.tolowercase (). equals (soumeverification.tolowercase ())) {out.println ("oui !!!"); } else {out.println ("Non !!!"); }} else {out.println ("Non !!!"); } session.reMoveAtTribute ("Vérification"); // empêche les utilisateurs de soumettre des formulaires à plusieurs reprises} / ** * @see httpservlet # doPost (httpservletRequest, HttpservletResponse Response) * / Protected Void dopost (HttpServletRerest Request, httpserReRsesponse Réponse). TODO Méthode générée automatiquement Stub Doget (demande, réponse); }Le rendu de course final est le suivant
Ce qui précède concerne cet article, j'espère qu'il sera utile à l'apprentissage de tout le monde.