1. Prefacio
La ventaja de usar códigos de verificación en las páginas de formulario es que evita efectivamente que los usuarios envíen formularios de forma maliciosa o el uso de complementos para atacar ilegalmente el sistema.
2. Condiciones de preparación
1. Un proyecto web normal webproject;
2. Un servidor web Tomcat.
3. Ideas de implementación:
1. Personalice un servlet VerifyCodeServlet para dibujar una imagen de código de verificación que contenga caracteres de verificación. Las imágenes aquí deben dibujarse manualmente usando Graphics2D;
2. Use el SRC de la etiqueta IMG para hacer referencia a este servlet en la página específica para mostrar el servlet;
3. Debido a que la información del código de verificación se coloca en la sesión al dibujar la imagen, después de enviar el formulario, puede comparar el valor guardado en la sesión con el código ingresado por el usuario para verificar si la entrada es correcta.
La mayoría de los códigos de verificación implementados a través de servlets se implementan en línea, y se ingresa la lógica a continuación:
paso:
1. Genere al azar cadenas de código de verificación al solicitar el inicio de sesión en la página;
2. Almacene la cadena de código de verificación generada en la sesión;
3. Genere imágenes de código de verificación basadas en la cadena del código de verificación y luego emite las imágenes del código de verificación al cliente para que muestre;
4. Compare la cadena del código de verificación ingresada por el usuario al enviar la solicitud de inicio de sesión con la cadena en la sesión.
4. El código específico es el siguiente:
paquete com.servlet; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image.bufferedImage; import java.util.random; import javax.imageio.imageio; import javax.servlet.servletException; import javax.servlet.servletOutputStream; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpsession; / ** * Servlet que genera imagen de código de verificación * @Author Administrator * */ public class VerifyCodeservlet extiende httpservlet {private static final long serialversionUid = -5051097528828603895l; /*** Ancho de imagen del código de verificación. */ private int width = 100; /*** La altura de la imagen del código de verificación. */ private int altura = 30; / *** Número de caracteres de código de verificación*/ private int codecount = 4; / *** Altura de fuente*/ private int fontheight; / *** El valor del eje x del primer carácter, porque las coordenadas de los siguientes caracteres se incrementan en secuencia, su valor del eje x es un múltiplo de Codex*/ private int Codex; / *** Codey, el valor del eje y del carácter de verificación, porque los valores son los mismos debido al paralelismo*/ private int codey; /** * codeSequence represents the sequence value that the characters are allowed to appear*/ char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** Inicializar el atributo de imagen de verificación*/ public void init () lanza ServletException {// Obtener información inicial de Web.xml // Width String Strwidth = this.getInitParameter ("Width"); // String de altura strheight = this.getInitParameter ("altura"); // Número de caracteres String StrCodeCount = this.getInitParameter ("Codecount"); // Convierta la información configurada en una prueba numérica {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 (NumberFormateException e) {E.PrintStackTrace (); } // Ancho-4 Retire las posiciones redundantes izquierda y derecha para que el código de verificación sea más concentrado, y cuanto más lo reduce, más concentrado está. // Codecount+1 // Asignación de equi-variante del ancho mostrado, incluidos los espacios en los lados izquierdo y derecho Codex = (Width-4) /(Codecount+1); // Altura - 10 Código de verificación de visualización central fontheight = altura - 10; Codey = altura - 7; } /** * @param request * @param response * @throws ServletException * @throws java.io.IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // Define image buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.type_int_rgb); Graphics2d GD = Buffimg.CreateGraphics (); // Crear una clase de generador de números aleatorios Random Random = new Random (); // llenar la imagen como blanco gd.setcolor (color.light_gray); gd.fillrect (0, 0, ancho, altura); // Crear una fuente, el tamaño de la fuente debe determinarse de acuerdo con la altura de la imagen. Fuente Font = nueva fuente ("FixedSys", Font.Plain, Fontheight); // Establecer la fuente. gd.setFont (fuente); // Dibuja bordes. GD.SetColor (color.black); gd.drawrect (0, 0, ancho - 1, altura - 1); // Generar aleatoriamente 160 líneas de interferencia, lo que hace que el código de autenticación en la imagen sea menos probable que sean detectados por otros programas. GD.SetColor (color.gray); for (int i = 0; i <16; i ++) {int x = random.nextint (ancho); int y = random.nextint (altura); int xl = random.nextint (12); int yl = random.nextint (12); gd.drawline (x, y, x + xl, y + yl); } // RandomCode se usa para guardar códigos de verificación generados aleatoriamente para que el usuario pueda verificar después de iniciar sesión. StringBuffer RandomCode = new StringBuffer (); int rojo = 0, verde = 0, azul = 0; // genera aleatoriamente un código de verificación para el número de código de código. for (int i = 0; i <codeCount; i ++) {// Obtenga el número de código de verificación generado aleatoriamente. String strrand = string.ValueOf (codeSequence [random.nextint (36)]); // Generar componentes de color aleatorios para construir el valor de color, de modo que el valor de color de cada salida de dígitos sea diferente. rojo = Random.NextInt (255); verde = Random.NextInt (255); Blue = Random.NextInt (255); // Dibuje el código de verificación en la imagen con el color generado aleatoriamente. GD.SetColor (nuevo color (rojo, verde, azul)); GD.DrawString (strrand, (i + 1) * Codex, Codey); // Combinar los cuatro números aleatorios generados juntos. randomcode.append (strrand); } // Guarde el código de verificación de cuatro dígitos en la sesión. Httpsession session = request.getSession (); session.SetAttribute ("ValidateCode", RandomCode.ToString ()); // El caché de la imagen está prohibido. respuesta.setheader ("Pragma", "No-Cache"); Respuesta.setheader ("Cache-Control", "No-Cache"); respuesta.setDateHeader ("expiras", 0); respuesta.setContentType ("Image/jpeg"); // Salida la imagen a la transmisión de salida del servlet. ServLetOutputStream SOS = Response.getOutputStream (); Imageio.write (buffimg, "jpeg", sos); sos.close (); }}Luego configure este servlet que genera código de verificación en Web.xml, como sigue:
<Servlet> <Servlet-name> VerifyCodeServlet </Servlet-Name> <Servlet-Class> com.servlet.verifyCodeservlet </servlet-class> <initparam> <amamname> width </paramname> <Amam-Value> 32 </param-value> </ init-param> <it-param> <amamname> codecount </param-name> <amam-value> 4 </param-value> </it-param> </servlet> <ervlet-mapping> <ervlet-name> verifycodeservlet </ervlet-name> <URL-Pattern>/VerifyCodeServlet </url-Pattern> </Servlet-Mapping>
Inicie el servidor e ingrese la barra de direcciones del navegador: http: // localhost: 8080/webproject/verifyCodeservlet
Verifique el efecto de visualización, como sigue:
1. El código de verificación cambia cada vez que actualiza el código de verificación, porque el servlet ha configurado para deshabilitar el caché del navegador.
2. Se encontró un problema aquí: si usa el navegador Firefox, el método de servicio reescrito en VerifyCodeServlet se ha ejecutado dos veces, y lo mismo es cierto si reescribe el método Doget o el método Dopost. Y otros navegadores no ven esta situación. Más tarde, se descubrió que si se hizo referencia al servlet a través de la página, sería normal llamarlo.
Luego puede hacer referencia al código de verificación en la página, el código específico es el siguiente:
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" PageEncoding = "utf-8"%> <! DocType html public "-// w3c // dtd html 4.01 transición // en" "http://www.w3.org/tr/html4/loos.dttd <html> <fead> <meta http-equiv = "content-type" content = "text/html; charset = ISO-8859-1"> <title> Insertar título aquí </title> </head> <body> <div> <% string inputCode = request.getParameter ("inputCode"); String VerifyCode = (String) Session.getAttribute ("ValidateCode"); if (inputCode! = null && verifycode! = null) {out.print ("código de verificación real:" + verifycode + "<br/>" + "código de verificación de entrada del usuario:" + inputcode + "<br/>"); inputCode = inputCode.ToUpperperCase (); // case insensible out.print ("Compare el código de verificación para probar la entrada del usuario" + (inputCode.equals (VerifyCode)? "Correcto": "Error") + "); } %> <form de acción = "index.jsp"> código de verificación: <input name = "inputCode" value = ""/> <img src = "verifyCodeServlet" align = "Middle" onClick = "javaScript: refresh (this);" OnMouseOver = "MouseOver (this)"/> <br/> <input name = "enviar" type = "subt" valor = "enviar"/> </form> </div> <script> function refrhesh (obj) {obj.src = "VerifyCodeservlet?" + Math.random (); } function mouseover (obj) {obj.style.cursor = "puntero"; } </script> </body> </html> El código anterior envía el código de verificación al JSP actual a través del formulario para verificar si el código de verificación ingresado por el usuario es correcto. El efecto específico de la operación es el siguiente:
1. Ingrese el código de verificación correcto
2. Ingrese el código de verificación incorrecto