Herramientas:
paquete com.lhy.web.servlet; import java.awt.basicstroke; import java.awt.color; import java.awt.font; import java.awt.graphics2d; import java.awt.image.bufferedimage; import java.io.filenotfoundexception; import java.io.fileOutsam; java.io.ioException; import java.io.outputstream; import java.util.random; import javax.imageio.imageio; public class VerifyCode {private int w = 70; // Longitud de imagen Private int h = 35; // IMPRESA ADOLESTIVO R = NUEVA NUEVA ALETIVA () fuente "," Técnica china Kai "," Fuente en negrita "," chino nuevo wei "," lishu chino "," microsoft elegante negro "," kai técnica_gb2312 "} cadena privada [] fontnames = {" canción "," técnica china kai "," font bold "," Microsoft Black "," Kai técnica_gbb22312 "; // Código de verificación caracteres opcionales Códigos de cadena privada = "23456789ABCDEFGHJKMNOPQRSTUVWXYZABCDEFGHJKMNPQRSTUVWXYZ"; // Color de fondo Color privado Bgcolor = nuevo color (255, 255, 255); // texto en el código de verificación de texto privado de cadena; // Generar color aleatorio de color privado RandomColor () {int rojo = R.NextInt (150); int verde = R.NextInt (150); int blue = R.NextInt (150); devolver nuevo color (rojo, verde, azul); } // Generar fuentes aleatorios de fuente privada randomfont () {int index = r.nextint (fontnames.length); String fontName = fontnames [index]; // Generar el nombre de fuente aleatoria int style = R.NextInt (4); // Generar estilo aleatorio, 0 (sin estilo), 1 (Bold), 2 (cursiva), 3 (Bold + Cursals) int size = R.NextInt (5) + 24; // Generar un tamaño de fuente aleatorio, 24 ~ 28 devuelve nueva fuente (nombre de fuente, estilo, tamaño); } // dibujar líneas de interferencia Private void Drawline (Imagen de BufferedImage) {int num = 3; // dibujar 3 gráficos2d g2 = (gráfico2d) image.getgraphics (); para (int i = 0; i <num; i ++) {// crea las coordenadas de dos puntos, es decir, 4 valores int x1 = r.nextint (w); int y1 = R.NextInt (H); int x2 = R.NextInt (W); int y2 = R.NextInt (H); G2.Setstroke (nuevo BasicStroke (1.5f)); g2.setColor (color.blue); // La línea de interferencia es azul G2.Drawline (x1, y1, x2, y2); // dibujar línea}} // Generar aleatoriamente un carácter privado privado randomChar () {int index = r.nextint (codes.length ()); devolver CODES.CHARAT (índice); } // Crear bufferedimage privado bufferedImage createImage () {// ancho, altura, tipo de imagen bufferedImage imagen = new BufferedImage (W, H, BufferedImage.Type_int_rgb); Graphics2d G2 = (Graphics2d) Image.getGraphics (); g2.setColor (this.bgcolor); G2.Fillrect (0, 0, W, H); imagen de retorno; } // Devuelve el texto en la imagen del código de verificación public String getText () {return text; } // Guardar la imagen en la salida de transmisión de salida especificada Public static void outen (BufferedImage Image, outputStream out) lanza ioexception {imageIO.write (imagen, "jpeg", out); } // Llame a este método para obtener el código de verificación public bufferedImage getImage () {bufferedImage image = createImage (); // Cree la imagen Buffer Graphics2d g2 = (Graphics2d) Image.getGraphics (); // Obtener el entorno de dibujo StringBuilder SB = New StringBuilder (); // Usar para cargar el código de verificación generado // CARACTENTES en el dibujo 4 CARACTERTES AL IMAGEN DE INTENCIÓN (INT INT INTI (4 4; i ++) {// bucle cuatro veces, cada vez genera una cadena de caracteres s = randomchar ()+""; // aleatoria una letra sb.append (s); // Agregar letras al flotador SB x = i * 1.0f * w /4; // Establecer las coordenadas del eje X del carácter actual G2.SetFont (RandomFont ()); // Establecer la fuente aleatoria G2.SetColor (RandomColor ()); // establecer color aleatorio G2.DrawString (S, X, H-5); // dibujar una imagen} this.text = sb.ToString (); // asigna la cadena generada a this.Text Drawline (imagen); // Agregar la imagen de retorno de la línea de interferencia; } public static void main (string [] args) lanza FileNotFoundException, ioException {verifyCode vc = new VerifyCode (); // Cree el objeto de la clase VerifyCode BufferedImage bi = vc.getImage (); // Call getImage () Método para obtener un objeto BufferEdimage Verify 3.jpg ")); // llame al método de salida del método estático () para guardar la imagen en la transmisión de salida del archivo System.out.println (vc.gettext ()); // Imprima el valor de texto del código de verificación en la consola}}VerifyCodeservlet:
paquete com.lhy.web.servlet; import java.awt.image.bufferedImage; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; public class VerifyCodeServlet extiende httpservlet {public void doget (httpservletRequest solicitud, httpservletResponse respuesta) lanza ServletException, IOException { /** 1. Generate Image* 2. Guardar el texto en la imagen en el campo de la sesión* 3. VC = new VerifyCode (); Bufferedimage image = vc.getImage (); request.getSession (). setAttribute ("session_vcode", vc.gettext ()); // Guarde el texto en la imagen en el campo Session VerifyCode.output (image, respuesta.getOutputStream ()); }}LoginServlet:
paquete com.lhy.web.servlet; import java.io.ioexception; import javax.servlet.requestdispatcher; import javax.servlet.servletexception; import javax.servlet.http.cookie; import javax.servlet.http.httpservlet; importar; javax.servlet.http.httpServletRequest; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import javax.servlet.http.httpsession; public class loginservlet extensas DOPOST (solicitud de httpservletrequest, respuesta httpservletreponse) lanza ServletException, ioexception { /** Código de verificación de verificación* 1. Obtenga el código de verificación correcto de la sesión* 2. Obtenga el código de verificación completado por el usuario de la forma* 3. ¡Haga comparación! * 4. Si lo mismo es verdadero, se ajuste, de lo contrario, guarde el mensaje de error en el dominio de solicitud y avance a Login.jsp */ String SessionCode = (String) request.getSession (). GetAttribute ("session_vcode"); String ParamCode = request.getParameter ("VerifyCode"); if (? request.getRequestDIsPatcher ("/login.jsp"). Forward (solicitud, respuesta); devolver; } /** 1. Obtenga datos de formulario* / // manejar las preguntas chinas. // Obtener String UserName = request.getParameter ("UserName"); Cadena contraseña = request.getParameter ("contraseña"); /** 2. Verifique si el nombre de usuario y la contraseña son correctos*/if ("itcast" .equalSignorEcase (username)) {// Iniciar éxito/** Elemento adicional: Guardar el nombre de usuario en la cookie y enviarlo al navegador del cliente* cuando login.jsp se abre nuevamente, la cocinera en la solicitud se leerá en login.jsp y visualizarlo en el cuadro de texto del nombre de usuario*/ Cookie ("uname", nombre de usuario); // crea cookie cookie.setMaxage (60* 60* 24); // Establezca la vida de cookie en una respuesta de 1 día. session.SetAttribute ("UserName", nombre de usuario); // Guardar el nombre de usuario en la respuesta del dominio de la sesión.sendedirect ("/test/succ1.jsp"); } else {// Iniciar fallas/** 4. Si falló*> Guardar mensaje de error para solicitar el dominio*> reenviar a login.jsp*/request.setTtribute ("msg", "¡Error en nombre de usuario o contraseña!"); RequestDisPatcher qr = request.getRequestDispatcher ("/login.jsp"); // Obtener adelante qr.forward (solicitud, respuesta); // reenviar}}}Login.jsp:
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <%string path = request.getContextPath (); String basepath = request.getScheme ()+": //"+request.getServerNeN ()+":"+request.getServerPort ()+pATH+"/";%; "-// w3c // dtd html 4.01 transitional // en"> <html> <fead> <base href = "<%= basepath%>" rel = "nofollow"> <title> my jsp 'login.jsp' inicial de inicio </title> <meta http-equiviv = "pragma" contenido = "no cache"> <metaa de inicio </title> <meta http-oquiv = "pragma" contenido = "no cache"> <metaa http-equiv = "cache-confontrol" content = "no-cache"> <meta http-equiv = "expires" content = "0"> <meta http-equiv = "palabras clave" content = "keyword1, weyword 2, keyword3"> <meta http-oquiv = "descripción" Content = "esto es mi página" << type = "text/css" href = "styles.css" rel = "externo nofollow"> -> <script type = "text/javaScript"> function _change () {/ * 1. Obtenga el elemento IMG 2. Modifique su src */var imgele = document.getElementById ("img"); imgele.src = "<%= basepath%> servlet/verifycodeservlet? a =" + new Date (). getTime ();} </script> </head> <body> <%-Esta página proporciona un formulario de inicio de sesión, y también muestra un mensaje de error-%> <h1> login </h1> <%/*¡Lea la cookie nombrada! Si está vacío, se muestra: "" Si no está vacío, se muestra: el valor de la cookie */string uname = ""; cookie [] cs = request.getcookies (); // Obtener todas {// Busque la cookie llamada uname uname = c.getValue (); // Obtenga el valor de esta cookie y le da a la variable Uname}}}%> <% string Message = ""; String msg = (string) request.getAttribute ("msg"); // Obtenga el atributo llamado msg en el campo de solicitud if (msg! = Null) {mensaje = msg; }%> <font color = "rojo"> <b> <%= mensaje%> </b> </font> <form de acción = "servlet/loginservlet" método = "post"> <%-muestra el nombre de usuario nombre en la cookie en el cuadro de texto del nombre del usuario-%> username: <input type = "text" name = "username" valor = "<%>"%> "/>> <br/> contraseña <bassion" name = "Password"/> <br/> Código de verificación: <input type = "text" name = "verifycode" size = "3"/> <img id = "img" src = "<%= basepath%> servlet/verifycodeservlet"/> <a href = "javaScript: _change ()" rel = "noFllow"> cambio un </a> <aBR/> <bry type/"Subting" value = "Login"/> </form> </body> </html>Loginsucces:
<body> <h1> Succ1 </h1> <%String UserName = (String) Session.getAttribute ("UserName"); if (username == null) {/ * 1. Guarde el mensaje de error en el dominio de solicitud y reenvíelo a login.jsp */request.setTribute ("" Msg "," ¡Todavía está iniciado! request.getRequestDIsPatcher ("/login.jsp"). Forward (solicitud, respuesta); return;}%> Bienvenido, cálida bienvenida, bienvenido <%=username %> líder para guiar el trabajo!
</body> </html>
Archivo de configuración:
<servlet> <servlet-name> loginservlet </servlet-name> <ervlet-class> com.lhy.web.servlet.loginservlet </servlet-class> </servlet> <ervlet mapping> <servlet-mapping> <ervlet-name> loginservlet </servlet-name> <Ull-pattern>/servlet/loginservlet </url-patter <Servlet> <Servlet-name> VerifyCodeServlet </servlet-name> <ervlet-class> com.lhy.web.servlet.verifyCodeservlet </servlet-class> </servlet> <ervlet-mapping> <ervlet-name> verifycodeservlet </servlet-name> <Ull-pattern>/servlet/verifycodeservlet </url- urly>> </Servlet-mapping>
Sugerencia: es mejor establecer el servlet que genera el código de verificación sin caché, para que no necesite agregar una marca de tiempo cuando la página solicita la imagen del código de verificación. Agregar la marca de tiempo es engañar al navegador para evitar que el navegador lea la imagen del código de verificación en el caché, y no hay respuesta después de hacer clic para cambiarlo. Esto no es algo bueno. Cada vez que hago clic para cambiar otra imagen, el navegador almacenará en caché las imágenes recién obtenidas localmente. Si no se almacena en el servlet, no los almacenará en caché localmente.
Resumir
El anterior es el código de ejemplo de la herramienta del código de verificación Java presentada por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!