Cet article sera entièrement expliqué de la page de la réception au bureau arrière. Jetons un coup d'œil ci-dessous.
1. Code de premier plan, image.jsp
<% @ 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.dtd"><html><head><meta http-equiv =" contenu-type "contenu =" text / html; charset = utf-8 "> <it titre> Obtenir du code d'image </taptin src = "$ {pagecontext.request.contextpath} /static/js/jquery-1.10.2.min.js"> </ script> </ head> <body> <form action = "##" Method = 'Post'> <entrée type = "Hidden" id = "userId" name = "userrid" value = ""> <v> <v> <v> id = "LoginName" placeholder = "username" value = "" class = 'form-control' /> </ div> </ div> <div> <input type = "mot de passe" AutoCompletet = "off" id = "pwd" name = "pwd" placeholder = "password" class = 'form-control' /> </v> </v> <v> <v> <pow onblur = "checkImg (this.value)" name = "validatecode" type = "text" placeholder = "Entrer le code de vérification" /> </vascript: flushvalidatecode (); "/> </pannet> <p> >Change one</a></p> </div> <div> <span></span> </div> <div> <div> <input type="checkbox" name="remember" value="1" class='icheck-me' data-skin="square" data-color="blue" id="remember"> <label for="remember"> Remember me</label> </div> <input type="button" value="Login" onClick = "JavaScript: soumeForm ();" class = 'btn btn-primary'> </ div> </ form> <script type = "text / javascrip document.getElementById ("CodevalidateImg"); validateImgObject.src = "$ {pageContext.Request.ContextPath} / GetSysManageLogincode? Time =" + New Date ();} / * Vérifiez que le code de vérification est entré correctement * / Fonction CheckImg (code) {var url = "$ {pageContext.request.contextPath} / CheckImageCode"; $ .get (url, {"validatecode": code}, function (data) {if (data == "ok") {alert ("ok!")} else {alert ("error!") flushvalidatecode ();}})} </cript> </ body> </ html>2. Code d'arrière-plan ImageGenController.java
package com.dufyun.springmvc.web.controller; import javax.servlet.http.cookie; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRessust org.springframework.util.stringutils; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.Responsebody; import co.dufy.javaweb.test.randomValidatecode; @ConTrolerPublic Class ImageGencronConConde; @ConTrollerPublic Class ImageGenConConConOd @RequestMapping (value = "/ toimg") String public toimg () {return "image / image"; } // Connexion pour obtenir le code de vérification @RequestMapping ("/ GetSysManageLogInCODE") @ResponseBody Public String GetSysManageLoginCODE (HttpservletResponse Response, HttpservletRequest Request) {Response.SetContentType ("Image / JPEG"); // Définir le type correspondant pour indiquer au navigateur de publier le contenu comme une image "); Response.sethEader ("Pragma", "No-cache"); // Définissez les informations d'en-tête de réponse pour indiquer au navigateur de ne pas mettre en cache cette réponse de contenu.sethEader ("Cache-Control", "No-cache"); Response.sethEader ("set-cookie", "name = value; httponly"); // définir la propriété httponly pour empêcher les attaques XS Response.setDateHeader ("expire", 0); RandomValidateCode randomValidateCode = new randomValidateCode (); try {randomvalidatecode.getRandcode (request, réponse, "imagecode"); // Méthode d'image de sortie} catch (exception e) {e.printStackTrace (); } retour ""; } // Code de vérification vérification @ requestmapping (value = "/ checkImageCode") @ResponseBody public String CheckTcode (HttpServLetRequest Request, HttpServletResponse Response) {String validateCode = request.getParameter ("validatecode"); String code = null; // 1: Obtenez les informations du code de vérification dans le cookie cookie [] cookies = request.getcookies (); for (cookie cookie: cookies) {if ("imagecode" .equals (cookie.getName ())) {code = cookie.getValue (); casser; }} // 1: Obtenez les informations du code de vérification de session // String code1 = (String) request.getSession (). GetAtTribute (""); // 2: Déterminez si le code de vérification est correct if (! StringUtils.isempty (validatecode) && validatecode.equals (code)) {return "ok"; } return "erreur"; // Je n'ai pas effectué la vérification du traitement flou de taille de lettre ici. Si vous êtes intéressé, vous pouvez l'essayer! }}3. RandomvalidateCode.java Classe d'outils pour générer du code de vérification
package com.dufy.javaweb.test; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image.bufferedimage; import java.io.bytearrayoutputStream; import java.util.random; import javax.imageo.imageio; javax.servlet.http.cookie; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; public class randomvalidatecode {private random random = new random (); String privé randstring = "0123456789abcdefghijklmnopqrstuvwxyz"; // String généré aléatoirement int private width = 80; // width int private int height = 26; // image height private lineSize = 40; // nombre de lignes d'interférence privé FONT ("Fixys", font.center_baseline, 18); } / * * Get Color * / Private Color getRandColor (int fc, int bc) {if (fc> 255) fc = 255; if (bc> 255) bc = 255; int r = fc + random.nextint (bc - fc - 16); int g = fc + random.nextint (bc - fc - 14); int b = fc + random.nextint (bc - fc - 18); retourner une nouvelle couleur (r, g, b); } / * * Draw String * / private String drawstring (graphics g, String randomString, int i) {g.setfont (getFont ()); g.setColor (nouvelle couleur (random.nextint (101), random.nextint (111), random .Nextint (121))); String rand = string.valueof (getrandomString (random.nextint (randstring.length ()))); RandomString + = Rand; g.translate (random.nextint (3), random.nextint (3)); G.Drawstring (Rand, 13 * I, 16); retourner RandomString; } / * * Draw la ligne d'interférence * / private void Drawline (Graphics g) {int x = random.nextint (width); int y = random.nextint (hauteur); int xl = random.nextint (13); int yl = random.nextint (15); G.Drawline (x, y, x + xl, y + yl); } / * * Obtenez des caractères aléatoires * / public string getRandomString (int num) {return string.valueof (randstring.charat (num)); } / ** * générer une image aléatoire * / public void getrandcode (httpsservletRequest request, httpservletResponse, key) {// La classe BufferedImage est une classe d'image avec un tampon, et la classe d'image est une classe utilisée pour décrire l'image BufferedImage Image = New BuffredImage (largeur, hauteur, tampon. Graphiques g = image.getGraphics (); // générer un objet graphique de l'objet image. Vous pouvez effectuer diverses opérations de dessin sur l'image en modifiant l'objet G.Fillrect (0, 0, largeur, hauteur); G.setfont (New Font ("Times New Roman", font.roman_baseline, 18)); g.setColor (getrandColor (110, 133)); // dessine la ligne d'interférence pour (int i = 0; i <= lineSize; i ++) {drawline (g); } // dessiner la chaîne de caractères aléatoires randomString = ""; for (int i = 1; i <= stringNum; i ++) {randomString = drawstRing (g, randomString, i); } // 1: Mettez le code de vérification généré au hasard dans le cookie cookie Cookie = nouveau cookie (clé, RandomString); réponse.addcookie (cookie); // 2: Mettez le code de vérification généré au hasard dans la chaîne de session sessionID = request.getSession (). GetID (); request.getSession (). setAttribute (sessionId + key, randomString); System.out.println ("************" + RandomString); // Résumé: Les deux méthodes sont bonnes, // (1): Utilisez des cookies pour envoyer du code de vérification au navigateur avant, ce qui n'est pas sûr! Non recommandé pour une utilisation. // (2): L'utilisation de la méthode de session peut résoudre le problème que le code de vérification n'est pas envoyé au navigateur, ce qui est plus sécurisé, mais si le nombre d'utilisateurs est trop grand, une telle méthode de stockage exercera une pression sur le serveur et affectera les performances du serveur. Non recommandé pour une utilisation. // Cette méthode est temporairement implémentée ici. La meilleure façon est de stocker le code de vérification généré dans le cache utilisé dans le projet et de définir le temps d'invalidation, qui peut non seulement atteindre la sécurité mais également réduire la pression sur le serveur. g.dispose (); essayez {bytearrayoutputStream tmp = new bytearrayoutputStream (); Imageo.write (image, "png", tmp); tmp.close (); Integer contentLength = tmp.size (); Response.sethEader ("Content-Length", ContentLength + ""); réponse.getOutputStream (). Write (tmp.ToByTearray ()); // Sortie l'image en mémoire au client dans Flow} Catch (Exception E) {e.printStackTrace (); } enfin {try {réponse.getOutputStream (). flush (); réponse.getOutputStream (). Close (); } catch (exception e2) {e2.printStackTrace (); }}}} 4. Résumé
Le contenu de cet article se termine ici. Si vous ne comprenez pas le contenu à l'intérieur, vous pouvez laisser un message à discuter. J'espère que le contenu de cet article sera utile à l'étude et au travail de chacun.