Le code ressemble à ceci :
importer java.awt.Color ;
importer java.awt.Font ;
importer java.awt.Graphics ;
importer java.awt.image.BufferedImage ;
importer java.util.Random ;
importer javax.imageio.ImageIO ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
/**
* <b>fonction :</b> classe d'outil de génération de code de vérification
* @projectNetWorkService
* @package com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 15:05:50
*@auteurhoojo
*/
@SuppressWarnings("inutilisé")
classe publique ValidCodeUtils {
/*************************************************** ***** **********************
* Largeur du code de vérification
*/
public statique int LARGEUR = 60 ;
/***
* Hauteur du code de vérification
*/
public statique int HAUTEUR = 20 ;
/*************************************************** ***** **********************
* La couleur d'arrière-plan du code de vérification COLOR_FC_BG doit être plus petite que COLOR_BC_BG
*/
public statique int COLOR_FC_BG = 200 ;
/***
* La couleur d'arrière-plan du code de vérification COLOR_FC_BG doit être plus petite que COLOR_BC_BG
*/
public statique int COLOR_BC_BG = 250 ;
/*************************************************** ***** **********************
* La couleur de la ligne d'interférence d'arrière-plan du code de vérification COLOR_FC_LINE doit être plus petite que COLOR_BC_LINE.
*/
public statique int COLOR_FC_LINE = 160 ;
/***
* La couleur de la ligne d'interférence d'arrière-plan du code de vérification COLOR_FC_LINE doit être plus petite que COLOR_BC_LINE.
*/
public statique int COLOR_BC_LINE = 200 ;
/*************************************************** ***** ****************************
* La couleur du code de vérification COLOR_FC_CODE doit être plus petite que COLOR_BC_CODE
*/
public statique int COLOR_FC_CODE = 20 ;
/***
* La couleur du code de vérification COLOR_FC_CODE doit être plus petite que COLOR_BC_CODE
*/
public statique int COLOR_BC_CODE = 170 ;
/*************************************************** ***** ****************************
* Générer des couleurs dans la plage spécifiée
* La valeur de couleur @param fc range fc est inférieure à 255
* @param bc range bc la valeur de couleur est inférieure à 255
* @returnColor
*/
Couleur statique privée getRandColor (int fc, int bc) {
Aléatoire aléatoire = nouveau Aléatoire();
si (fc < 0)
fc = 0 ;
si (avant JC < 0)
avant JC = 1 ;
si (fc > 255)
fc = 255 ;
si (bc > 255)
avant JC = 255 ;
si (bc == fc)
avant JC += 10 ;
température int = 0 ;
si (bc < fc) {
température = avant JC ;
avant JC = FC ;
fc = température ;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
renvoyer une nouvelle couleur (r, g, b);
}
/**
* <b>Fonction :</b> Méthode Générer une image
* @createDate 2010-8-3 15:06:22
*@auteurhoojo
* @param demande HttpServletRequest
* Réponse @param HttpServletResponse
* @return booléen
* @throwsException
*/
public static boolean getImage (requête HttpServletRequest, réponse HttpServletResponse) lève une exception {
réponse.reset();
réponse.setContentType("image/jpeg");
//Définit que la page ne soit pas mise en cache
réponse.setHeader("Pragma", "Pas de cache");
réponse.setHeader("Cache-Control", "no-cache");
réponse.setDateHeader("Expire", 0);
//Créer une image en mémoire
Image BufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// Récupère le contexte graphique
Graphiques img = image.getGraphics();
// Générer une classe aléatoire
Aléatoire aléatoire = nouveau Aléatoire();
//Définir la couleur d'arrière-plan
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, LARGEUR, HAUTEUR);
//Définir la police
img.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// dessine des bordures
// g.setColor(nouvelle couleur());
// g.drawRect(0,0,largeur-1,hauteur-1);
// Génère aléatoirement 155 lignes d'interférence pour rendre le code d'authentification dans l'image difficile à détecter par d'autres programmes
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
pour (int je = 0; je < 155; i++) {
int x = random.nextInt(WIDTH);
int y = random.nextInt(HAUTEUR);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// Récupère le code d'authentification généré aléatoirement (4 chiffres)
Chaîne codeValue = "" ;
pour (int je = 0; je < 4; i++) {
//String rand = String.valueOf(random.nextInt(10));
Chaîne rand = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//Police aléatoire
//Affiche le code d'authentification dans l'image
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//l'image prend effet
img.dispose();
// Affiche l'image sur la page
return ImageIO.write(image, "JPEG", réponse.getOutputStream());
}
/**
* Générez aléatoirement des caractères, notamment des majuscules, des minuscules et des chiffres
* <b>fonction :</b> fonction
* @createDate 2010-8-23 10:33:55
*@auteurhoojo
* @retour
*/
chaîne statique publique getRandomChar() {
int index = (int) Math.round(Math.random() * 2);
Chaîne randChar = "";
commutateur (index) {
cas 0://caractères majuscules
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
casser;
cas 1://caractères minuscules
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
casser;
par défaut://numéro
randChar = String.valueOf(Math.round(Math.random() * 9));
casser;
}
retourner randChar;
}
/**
* <b>fonction :</b> générer aléatoirement des polices et des tailles de texte
* @createDate 2010-8-23 10:44:22
*@auteurhoojo
* @retour
*/
Police statique publique getRandomFont() {
String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"} ;
int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int fontSize = (int) Math.round(Math.random() * 4 + 16);
return new Font(fonts[fontIndex], Font.PLAIN, fontSize);
}
}
La valeur du code de vérification est stockée dans la session : request.getSession().setAttribute("codeValue", codeValue);
Comparez simplement la valeur saisie par l'utilisateur et la codeValue dans la session pour voir si elles sont égales ;
Voici la page jsp appelant le servlet : ValidCodeServlet.java
La classe d'outils de génération de code de vérification ValidCodeUtils ci-dessus est appelée dans ValidCodeServlet
paquet com.hoo.servlet ;
importer java.io.IOException ;
importer javax.servlet.ServletException ;
importer javax.servlet.http.HttpServlet ;
importer javax.servlet.http.HttpServletRequest ;
importer javax.servlet.http.HttpServletResponse ;
importer com.hoo.util.ValidCodeUtils ;
@SuppressWarnings("série")
la classe publique ValidCodeServlet étend HttpServlet {
public void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
essayer {
ValidCodeUtils.getImage(demande, réponse);
} attraper (Exception e) {
e.printStackTrace();
}
}
public void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
doGet(demande, réponse);
}
}
Appelez simplement la méthode servlet sur la page jsp
js : méthode reloadValidCode
fonction reloadValidCode(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMilliseconds();
}
Le "timed=" + new Date().getMilliseconds(); est nécessaire ici pour empêcher la mise en cache d'IE.
balise html :
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
Configurez simplement l'URL directement avec le nom du servlet, qui correspond à la configuration web.xml. Le chemin d'appel principal ${pageContext.request.contextPath}/validCodeServlet amènera le répertoire racine, ce qui est plus sûr.
configuration validCodeServlet dans web.xml
<servlet>
<servlet-name>validCodeServlet</servlet-name>
<servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>
</servlet>
<mappage-servlet>
<servlet-name>validCodeServlet</servlet-name>
<url-pattern>/validCodeServlet</url-pattern>
</servlet-mapping>