Pasos de generación de imágenes del código de verificación
Crea un objeto BufferedImage.
Obtenga el pincel de BufferedImage, es decir, llame al método getGraphics () para obtener el objeto gráfico.
Llame al método SetColor () y Fillrect () del objeto gráfico para establecer el color de fondo de la imagen.
Llame al método setColor () y drawline () del objeto gráfico para establecer la línea de interferencia de imagen.
Llame al método setRGB () del objeto BufferedImaged para establecer el ruido de la imagen.
Llame al método setColor (), setFont () y el método Drawstring () del objeto gráfico para establecer el código de verificación de imagen.
Debido a que el ancho y la altura de la imagen del código de verificación deben determinarse de acuerdo con el estilo del sitio web, el tamaño de la fuente debe determinarse de acuerdo con el ancho y la altura de la imagen, y se utiliza una pequeña habilidad.
paquete Util; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image; import java.awt.image.bufferedImage; import java.io.bytearRauteutputStream; import java.io.ioexception; import java.util.Random; javax.imageio.Imageio; Verificación de clase pública {String final estática privada Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; / *** Genere una imagen con ancho como ancho, altura como altura y código de verificación como código* @param Ancho El ancho de la imagen* @param altura de la altura de la imagen* @Param Código de verificación Código de verificación String* @return return VERIFICE Code*/ public staticimage GetImage (int width, int altura, código de cadena) {return getimage (width, altura, código, 20); } /** * Generar un ancho como ancho, altura como altura, el código de verificación es un código, el número de líneas de interferencia en la imagen es linecnt * @param ancho el ancho de la imagen * @param altura La altura de la imagen * @param Código de verificación Código de verificación * @param Linecnt El número de líneas de interferencia, se recomienda aproximadamente 10 y se puede ajustar de acuerdo con el resultado de la imagen * public static BufferedImage getImage (int width, int altura, código de cadena, int linecnt) {return createImage (ancho, altura, código, linecnt, 0.01); } /*** Generar una imagen con ancho, altura, altura y código de verificación es código, el número de líneas de interferencia en la imagen es Linecnt* La relación de ruido es ruid. De acuerdo con los resultados* @param, no ronda el porcentaje de píxeles de ruido en la imagen a los píxeles totales* @return return el código de verificación de imagen*/ public static bufferedimage getImage (int width, int altura, código de cadena, int linecnt, doble noiserate) {return CreateImage (width, altura, código, linecnt, noiserate); } /** * * Genere una imagen con ancho, altura y código de verificación. El número de líneas de interferencia en la imagen es Linecnt* La relación de ruido es ruidosa, es decir, el porcentaje de píxeles de ruido en la imagen* @param ancho El ancho de la imagen* @param altura de la altura de la imagen* @param Código de verificación Código Cadena* @param Linecnt El número de interferencia de la imagen se recomienda que se recomiende aproximadamente 10. a los píxeles totales* @return devuelve el código de verificación de imagen* / private static bufferedImage createImage (int width, inttight, código de cadena, int linecnt, doble roniserate) {int fontwidth = ((int) (ancho* 0.8)) / code.length (); int fontheight = (int) (altura * 0.7); // Para generar buenos códigos de verificación bajo cualquier ancho y altura, // El tamaño de la fuente es cuanto más pequeño en Fontheight, int FontSize = Math.min (FontWidth, Fontheight); // int paddingx = (int) (ancho * 0.1); int paddingy = altura - (altura - FontSize) / 2; // Crear una imagen BufferedImage Buffimg = nueva BufferedImage (ancho, altura, bufferedimage.type_int_rgb); // Obtener gráficos de pincel g = buffimg.getgraphics (); // establecer el color del pincel G.SetColor (GetRandcolor (200, 255)); // luego llene un rectángulo, es decir, establezca el color de fondo g.fillrect (0, 0, ancho, altura); // Establezca la línea de interferencia para (int i = 0; i <linecnt; i ++) {// almacenar para obtener los puntos de inicio y finalización de la línea de interferencia int xs = (int) (math.random () * width); int ys = (int) (math.random () * altura); int xe = (int) (math.random () * ancho); int ye = (int) (math.random () * altura); G.SetColor (GetRandcolor (1, 255)); G.Drawline (xs, ys, xe, ye); } // Agregar ruido int área = (int) (noiserate * ancho * altura); for (int i = 0; i <área; ++ i) {int x = (int) (math.random () * ancho); int y = (int) (math.random () * altura); buffimg.setrgb (x, y, (int) (math.random () * 255)); } // establecer fuente de fuente = nueva fuente ("Ravie", font.plain, fontSize); G.SetFont (fuente); for (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; } / *** Obtenga el color aleatorio, los valores de R, G, B están entre L y R* @Param L Intervalo izquierdo* @param R Intervalo derecho* @return Devuelve el valor de color aleatorio* / Color estático privado 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 intervalo = r - l; int r = l + (int) (math.random () * interval); int g = l + (int) (math.random () * interval); int b = l + (int) (math.random () * intervalo); devolver nuevo color (R, G, B); } / *** Genere aleatoriamente varias cadenas compuestas de letras y números en mayúsculas y minúsculas* @param len genera aleatoriamente caracteres dur* @return devuelve una cadena generada aleatoriamente de letras mayúsculas y minúsculas y números* / cadena estática pública getRandCode (int len) {código de cadena = ""; for (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alfabet.length ()); código = código + alfabet.charat (índice); } código de retorno; } / *** Convierta la imagen en la matriz de bytes* @param imagen de imagen* @return return the byte array* @throws ioexception* / public static byte [] getByTearray (bufferedImage Image) lanza IOException {byteArEAnTrePputStream = new ByTearRaUutputPutPutream (); Imageio.write (imagen, "png", baos); return baos.tobytearray (); // bytearRayOutputStream no requiere cierre}}Utilice la imagen del código de verificación
En VerificationCode.Java Servlet, llame a la clase anterior para generar la imagen del código de verificación y luego devuelva la imagen al cliente.
Doget vacío protegido (httpservletRequest, respuesta httpServletResponse) lanza ServletException, ioexception {httpsession session = request.getSession (); // Generar aleatoriamente una cadena y escribir el código de cadena de sesión = verificación.getRandCode (4); session.SetAttribute ("Verificación", código); BufferedImage image = util.verification.getImage (100,30, código, 5); respuesta.setContentType ("Imagen/PNG"); OutputStream out = Response.getOutputStream (); out.write (util.verification.getByTearray (imagen)); out.flush (); out.close (); }Establezca el código de verificación en index.jsp. Cuando el usuario hace clic en el código de verificación, llama al código JS para solicitar al servidor que obtenga el nuevo código de verificación. Debido a que el Servlet anterior que genera el código de verificación será almacenado en caché por el navegador, el código JS debe darle al servlet un parámetro aleatorio, de modo que el navegador envíe una solicitud al servidor para obtener un nuevo código de verificación, en lugar de leerlo en el caché.
<%@page import = "util.verification"%> <%@page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "Utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "". "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> title aquí </titter> <script type =" text/javascript "> function frenchode () {) {) document.getElementById ("Verificación"). Src = "/VerificationCode/VerificationCode? Hehe ="+Math.random (); } </script> </head> <body> <form de acción = "< %= request.getContextPath ()+"/checkverification " %>" método = "post"> código de verificación: <input type = "text" name = "submitverification"> <img id = "verificación" src = "< %= request.getContextPath ()+"/verificación " %>" %> "" "" " onClick = "RefreshCode ()"> <br> <input type = "Subt" name = "Subt" Value = "Subt"> </form> </body> </html>Finalmente, en el servlet checkverification.java, determinamos si el código de verificación ingresado por el usuario es correcto. Para facilitar a los usuarios, el código de verificación generalmente se establece para ser insensible al caso, por lo que debe convertirse en letras minúsculas antes de la comparación.
Doget vacío protegido (httpservletRequest, respuesta httpServletResponse) lanza ServletException, ioexception {httpsession session = request.getSession (); Verificación de cadena = (string) session.getAttribute ("Verificación"); Cadena Submitverification = request.getParameter ("Submitverification"); PrintWriter out = Response.getWriter (); if (verificación! = null && smitverification! = null) {if (verification.tolowerCase (). Equals (Submitverification.tolowerCase ())) {out.println ("¡Sí!"); } else {out.println ("no !!!"); }} else {out.println ("no !!!"); } session.removeAttribute ("verificación"); // Evite que los usuarios envíen formularios repetidamente}/** * @see httpservlet#dopost (httpservletRequest request, httpServletResponse respuesta) */protegido void dopost (httPserveRTrequest request, httpSeServeServeSponse Respuesta) ServetException { TODO Auto Generado Método Stub Doget (solicitud, respuesta); }La renderización de la carrera final es la siguiente
Lo anterior se trata de este artículo, espero que sea útil para el aprendizaje de todos.