Este artículo se explicará completamente desde la página de recepción hasta la ventana posterior. Echemos un vistazo a continuación.
1. Código de primer plano, Image.jsp
<%@ page lenguaje = "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"> podet src = "$ {PageContext.Request.ContextPath} /static/js/jquery-1.10.2.min.js"> </script> </head> <body> <form action = "##" método = 'post'> <input type = "hidden" id = "userid" name = "userid" valor = ""> <iv> <iv> <divs> <inying type = "text" hidden "id =" userid "name =" userid "valor =" "> <iv> <iv> <div> <input type =" text "Hidden" id = "userid" name = "userid" valor = ""> <iv> <iv> <div> <divir nombre = 'loginName' id = "LoginName" PlaceHolder = "UserName" Value = "" Class = 'Form-Control'/> </iv> </iv> <Div> <Div> <input type = "Password" Password "AutoComplete =" Off "Id =" Pwd "Name =" Pwd "PlazShander =" Password "Class = 'Enform-Control'/> </diviv> </diviv> id = "ValidateCode" onblur = "checkImg (this.Value)" name = "ValidateCode" type = "Text" PlaceHolder = "Ingrese el código de verificación"/> </div> <span> <img id = "codeValidEimg" onClick = "javascript: flushvalidateCode ();"/> </span> <p> <a href = "javascript: flushValidateCode ();" > Cambiar uno </a> </p> </div> <div> <span> </span> </div> <div> <div> <input type = "checkbox" name = "recuerda" valor = "1" class = 'iCheck-me' data-skin = "cuadrado" data-data-color = "azul" id = "recuerda"> <etiqueta para = "recordar"> recordarme </selabel> </div> <put type = "button" value "value" onClick = "JavaScript: SubmitForm ();" class = 'btn btn-imprimary'> </div> </form> <script type = "text/javaScript"> $ (documento) .Ready (function () {flushValidateCode (); // refrescar y generar código de verificación});/* Actualizar y generar código de verificación*/function FlushValidateCode () {var ValidateImgOntect = = document.getElementById ("CodeValidateImg"); ValidateImGoBject.Src = "$ {PageContext.Request.ContextPath}/GetSysManAgelogincode? Time =" + New Date ();}/* Verifique que el código de verificación se ingrese correctamente*/Funcion Checkimg (CODE) {var url = "$ {pageContext.Request.ContextPath}/checkImageCode"; $ .get (url, {"validateCode": código}, function (data) {if (data == "ok") {alert ("ok!")} else {alert ("error!") flushValidateCode ();}})} </script> </body> </html>2. Código de fondo ImageGencontroller.java
paquete com.dufyun.springmvc.web.controller; import javax.servlet.http.cookie; import javax.servlet.http.httpservletRequest; import javax.servlet.htp.httttpServletResponse; import org.springframework.sterotipo. org. @RequestMapping (value = "/toimg") Cadena pública a ToImg () {return "Image/Image"; } // Iniciar sesión para obtener el código de verificación @RequestMapping ("/getSySmanAgeloginCode") @ResponseBody String public Public String getSySmanAgelogInCode (httpServletReSponse Respuesta, httpservletRequest Solicitud) {Response.setContentType ("Image/JPEG"); // Establezca el tipo correspondiente para decir el browser a la salida de la imagen de la imagen de la imagen de la imagen de la imagen de la imagen de la imagen a la salida de la imagen a la generación de contenido. Response.setheader ("Pragma", "No-Cache"); // Establezca la información del encabezado de respuesta para decirle al navegador que no almacene en caché esta respuesta de contenido. respuesta.setheader ("set-cookie", "name = value; httponly"); // Establezca la propiedad httponly para evitar los ataques XS respuesta.setDateHeader ("expirar", 0); RandomValidateCode randomValidateCode = new RandomValidateCode (); Pruebe {randomValidateCode.getRandCode (solicitud, respuesta, "ImageCode"); // Método de imagen de salida} Catch (Exception e) {E.PrintStackTrace (); } devolver ""; } // Código de verificación Verificación @requestmapping (value = "/checkImageCode") @ResponseBody public String checktcode (httpservletRequest request, httpServletResponse respuesta) {cadena validateCode = request.getParameter ("ValidateCode"); Código de cadena = nulo; // 1: Obtenga la información del código de verificación en la cookie de cookie [] cookies = request.getcookies (); para (cookie cookie: cookies) {if ("imageCode" .equals (cookie.getName ())) {code = cookie.getValue (); romper; }} // 1: Obtenga la información del código de verificación de sesión // String Code1 = (String) request.getSession (). GetAttribute (""); // 2: Determine si el código de verificación es correcto si (! StringUtils.isEmpty (validateCode) && validateCode.equals (código)) {return "ok"; } return "Error"; // No realicé verificación del procesamiento difuso del tamaño de la letra aquí. Si está interesado, ¡puede probarlo! }}3. RandomValidateCode.Java Tool Class para generar código de verificación
paquete com.dufy.javaweb.test; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image.bufferedImage; import java.io.bytearRauteutputStream; import java.util.random; import javax.image.image.image javax.servlet.http.cookie; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; clase pública randomvalidateCode {private aleator aleator = new Random (); private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// Randomly generated string private int width = 80;// Picture width private int height = 26;// Picture height private int lineSize = 40;// Number of interference lines private int stringNum = 4;// Randomly generated characters/* * get font*/ private Font getFont() { return new Fuente ("FixedSys", 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); devolver nuevo color (R, G, B); } /** Draw String* / private String Drawstring (Graphics G, String RandomString, int i) {G.SetFont (getFont ()); G.SetColor (nuevo color (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); regresar randomstring; } /** Dibuja la línea de interferencia* / private void drawline (gráficos g) {int x = random.nextint (ancho); int y = random.nextint (altura); int xl = random.nextInt (13); int yl = random.nextint (15); G.Drawline (x, y, x + xl, y + yl); } /** Obtener caracteres aleatorios* / public String getRandomString (int num) {return string.ValueOf (randstring.charat (num)); } / *** Genere una imagen aleatoria* / public void getRandCode (httpservletRequest solicitud, respuesta httpservletResponse, tecla de cadena) {// La clase de BufferedImage es una clase de imagen con un buffer, y la clase de imagen es una clase utilizada para describir la imagen de la imagen Bufferedimage Image = New BufferEdimage (Width, altura, altura, bufferedimage.typePePePePePePE ,PEPE); Gráficos g = image.getgraphics (); // Generar objeto gráfico del objeto de imagen. Puede realizar varias operaciones de dibujo en la imagen modificando el objeto g.fillrect (0, 0, ancho, altura); G.SetFont (New Font ("Times New Roman", font.roman_baseline, 18)); G.SetColor (GetRandcolor (110, 133)); // Dibuja la línea de interferencia para (int i = 0; i <= lineize; i ++) {drawline (g); } // Dibuja la cadena de caracteres aleatoria randomstring = ""; for (int i = 1; i <= stringNum; i ++) {randomString = drawstring (g, randomstring, i); } // 1: Coloque el código de verificación generado al azar en la cookie cookie cookie = nueva cookie (clave, randomstring); Response.AddCookie (Cookie); // 2: Coloque el código de verificación generado aleatoriamente en la cadena de sesión SessionId = request.getSession (). GetId (); request.getSession (). setAttribute (sessionID+key, randomstring); System.out.println ("************" + RandomString); // Resumen: Ambos métodos son buenos, // (1): use cookies para enviar código de verificación al navegador delantero, ¡lo cual no es seguro! No recomendado para su uso. // (2): el uso del método de sesión puede resolver el problema de que el código de verificación no se envía al navegador, lo cual es más seguro, pero si el número de usuarios es demasiado grande, dicho método de almacenamiento ejercerá presión sobre el servidor y afectará el rendimiento del servidor. No recomendado para su uso. // Este método se implementa temporalmente aquí. La mejor manera es almacenar el código de verificación generado en el caché utilizado en el proyecto y establecer el tiempo de invalidación, lo que no solo puede lograr la seguridad sino que también reducir la presión sobre el servidor. G.Dispose (); intente {byteArRaReOutputStream tmp = new ByteArRaReOutputStream (); Imageio.write (imagen, "png", tmp); tmp.close (); Integer contentLength = tmp.size (); respuesta.setheader ("Content-longitud", contentLength + ""); respuesta.getOutputStream (). Write (tmp.tobytearray ()); // emite la imagen en la memoria al cliente en flujo} capt (excepción e) {e.printstackTrace (); } Finalmente {try {Response.getOutputStream (). Flush (); Response.getOutputStream (). Close (); } catch (Exception e2) {e2.PrintStackTrace (); }}}} 4. Resumen
El contenido de este artículo termina aquí. Si no comprende el contenido dentro, puede dejar un mensaje para discutir. Espero que el contenido de este artículo sea útil para el estudio y el trabajo de todos.