Lógica del código de verificación
También he realizado códigos de verificación en proyectos antes. Hay muchos códigos en Internet que generan códigos de verificación, y algunos paquetes JAR de terceros también pueden generar hermosos códigos de verificación. La lógica del código de verificación es muy simple. Es para colocar una etiqueta de imagen en la página de inicio de sesión, y SRC apunta a un controlador. Este controlador devuelve la imagen generada y devuelve la transmisión de salida a la página. Al generar la imagen, el texto en la imagen se coloca en la sesión. Al iniciar sesión, traiga el código de verificación ingresado y sácalo de la sesión. Compare los dos. El maestro dijo que usar el código de verificación integrado de seguridad de Spring es el mismo lo que dije, pero es más estandarizado y general.
Spring Security es una serie de cadenas de filtros, por lo que aquí el código de verificación también se declara como un filtro, se agrega antes del filtro de inicio de sesión de la cadena del filtro y luego personaliza una clase de excepción para responder al mensaje de error del código de verificación.
Estructura del código:
El código de verificación se coloca en el proyecto central y la configuración se realiza en el proyecto del navegador.
Código principal:
1. ImageCode:
Primero, la clase ImageCode encapsula la imagen del código de verificación, el texto y el tiempo de vencimiento
paquete com.imooc.security.core.validate.code; import java.awt.image.bufferedImage; import java.time.localdateTime; import java.time.localtime;/*** Código de verificación* className: imageCode* @Description: código de verificación* @author lihaoyang* @date 1, 2018*/rentiseNeMeCode* @Description: código de verificación* @author lihaoyang* @Date 1, 2018*/rent cift Class* @Description: Code de verificación* @author lihaoyang* @Date 1, 2018* Imagen de BufferedImage; código de cadena privada; PRIVADO LOCALDATETIME EXPRIRETime; // Punto de tiempo de vencimiento/** * * <p> Descripción: </p> * @param imagen * @param código * @param expiretn ¿cuántos segundos expira */public imageCode (imagen de bufferedimage, código de cadena, int expiretn) {super (); this.image = imagen; this.code = código; // Tiempo de vencimiento = Tiempo actual + Número de segundos caducados this.expireTime = localDateTime.Now (). Plusseconds (expiretn); } public ImageCode (imagen de BufferedImage, código de cadena, localDateTime ExperTime) {super (); this.image = imagen; this.code = código; this.expireTime = expireTime; } / *** Si el código de verificación ha expirado* @Description: si el código de verificación ha expirado* @param @return true expirado, falso no expirado* @return boolean true expirado, falso no expirado* @throws* @author lihaoyang* @date 2 de marzo de 2018* / public boolean isexPired () {return localDatETime.now (). Isafter (expirime (expereTime (expreteMe (expreteMe). } public BufferedImage getImage () {imagen de retorno; } public void setImage (imagen de BufferedImage) {this.image = image; } public String getCode () {código de retorno; } public void setCode (código de cadena) {this.code = code; } public localDateTime getExpireTime () {return expireTime; } public void setExpireTime (localDateTime ExpertEtime) {this.expireTime = expireTime; }}VerifyCode: una clase de herramientas para generar códigos de verificación. Aquí http://www.cnblogs.com/lihaoyang/p/7131512.html, por supuesto, también puede usar paquetes de jar de terceros, no importa.
ValidAteCodeException : excepción del código de verificación encapsulado
/** * @title: validateCodeeException.java * @package com.imooc.security.core.validate.code * @Description: todo * @author lihaoyang * @date marzo de 2018 */paquete com.imooc.security.core.validing; import org.springframework.security.core.authenticationException;/*** classname: validateCodeException* @Description: Excepción de error de código de verificación, excepción de autenticación que herede la seguridad de Spring* @author lihaoyang* @date 2 de marzo de 2018*/clase pública ValidateCodeeException Extends AuthenticationException {/** @fields */ Private static final Long SerialVersionUid = 1L; público validateCodeeException (string msg) {super (msg); }}ValidateCodeFilter : filtro de código de verificación
Lógica: heredar OnceperRequestFilter asegura que el filtro se llame solo una vez cada vez (no estoy seguro de por qué), inyectado en el procesador fallido de autenticación y llamado cuando la verificación falló.
package com.imooc.security.core.validate.code;import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.stringutils; import org.springframework.security.web.authentication.authenticationFailureHandler; importar org.springframework.social.connect.web.htttttsessionessionStrategy; importar org.springframework.social.weSconnect.weSconnect.weSt. org.springframework.web.bind.servletRequestBindingException; import org.springframework.web.bind.servletRequestUtils; import org.springframework.web.context.request.servletwebRequest; import Process the login verification code filter* ClassName: ValidateCodeFilter * @Description: * OncePerRequestFilter: The tool provided by spring ensures that the filter will be called only once each time* @author lihaoyang * @date March 2, 2018*/public class ValidateCodeFilter extends OncePerRequestFilter{ //Authorization failed processor private AuthenticationFailureHandler AutenticaciónFailureHandler; // Obtener clase de sesión de sesión SessionStrategy sessionStrategy = new httpSessessionStrategy (); @Override protegido Void dofilterInternal (solicitud de httpservletRequest, respuesta httpServletResponse, filterChain FilterChain) lanza ServletException, ioexception {// si es una solicitud de registro, ejecutar if (stringUtils.equals ("/autenticación/formar", request.getRequesturi ())) && stringUtils.equalSignorEcase (request.getMethod (), "post")) {try {validate (new ServletWebRequest (request)); } Catch (ValidateCodeeException e) {// llamando al controlador de errores, y finalmente llamando a su propia autenticaciónfailureHandler.AntoneuthenticationFailure (solicitud, respuesta, e); return; // finalizando el método, ya no llame a la cadena de filtro}} // no es una solicitud de inicio de sesión, llame a otra cadena de filtro filtreChain.dofilter (solicitud, respuesta); } /** * Código de verificación de verificación * @Description: Código de verificación de verificación * @param @param request * @param @throws ServletRequestBindingException * @return void * @throws ValidateCodeException * @author lihaoyang * @Date 2 de marzo de 2018 * /Valocador de validación (SERVETLETOTELETELTINGE ServletRetRequestRequrequrequrequrequrequrequrequRequrequRequreBrequ. Objeto ImageCode en la sesión ImageCode ImageCodeInsession = (imageCode) sessionStrategy.getAttribute (request, validateCodeController.session_key); // Saque el código de verificación en la cadena de solicitud de solicitud IMACEDENREQUEST = ServLetRequestUtils.getStringParameter (request.getRequest (), "imageCode"); // Compruebe si (stringUtils.isblank (imageCodeInRequest)) {tire nueva validateCodeException ("El código de verificación no puede estar vacío"); } if (imageCodeInsession == NULL) {Throw New ValidAteCodeException ("El código de verificación no existe, actualice el código de verificación"); } if (imageCodeInsession.isExPired ()) {// Eliminar el código de verificación caducado de la sesión sessionStrategy.removeAttribute (solicitud, validateCodeController.session_key); Tire nuevo ValidateCodeException ("El código de verificación ha expirado, actualice el código de verificación"); } if (! StringUtils.equalSignorEcase (imageCodeInsession.getCode (), imageCodeInRequest)) {Throw New ValidAteCodeException ("Error de código de verificación"); } // Se pasa la verificación, elimine el código de verificación en la sesión SessionStrategy.removeAttribute (solicitud, validateCodeController.session_key); } Public AuthenticationFailureHandler getAuthenticationFailureHandler () {return AuthenticationFailureHandler; } public void setAuthenticationFailureHandler (autenticationFailureHandler AuthenticationFailureHandler) {this.AuthenticationFailureHandler = AuthenticationFailureHandler; }}ValidateCodeController : generar control del código de verificación
paquete com.imooc.security.core.validate.code; import java.io.ioexception; import javax.imageio.imageio; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import org.springframework.social.connect.web.httpSessessionStrategy; import org.springframework.social.connect.web.sessionstrategy; import og.springframework.web.bind.annotation.getMapping; import org.springframework.webind.annotation.annotation.annotation; org.springframework.web.context.request.servletWebRequest;/** * Verificación CodeControl * className: ValidATeCodeController * @Description: toDo * @author lihaoyang * @Date 1 de marzo de 2018 */ @RestControllerPublicCal "Session_key_image_code"; // Obtener sesión SessionStrategy SessionStrategy = new httpSessessionStrategy (); @GetMapping ("/verifycode/image") public void createCode (httpservletRequest solicitud, respuesta httpservletResponse) lanza ioexception {imageCode imageCode = createImageCode (solicitud, respuesta); sessionStrategy.SetAttribute (new ServletWebRequest (solicitud), session_key, imageCode); ImageIO.Write (imageCode.getImage (), "jpeg", respuesta.getOutputStream ()); } private ImageCode CreateImageCode (HTTPServletRequest Solicitud, respuesta httpServletResponse) {VerifyCode VerifyCode = new VerifyCode (); return new ImageCode (VerifyCode.getImage (), VerifyCode.Gettext (), 60); }}Configuración de filtro en navegador de browserSecurityConfig :
paquete com.imooc.security.browser; import org.springframework.beans.factory.annotation.auTowired; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configur org. org.springframework.security.web.authentication.authenticationFailureHandler; import org.springframework.security.web.authentication.authenticationFailureHandler; import org.springframework.security.web.authentication.usernamepasswderswordationfilter; com.imooc.security.core.properties.securityproperties; import com.imooc.security.core.validate.code.validateCodeFilter; @configuration // Esta es una configuración de configuración de clases pública de la configuración de la configuración de la configuración de la configuración de la configuración de la configuración de la configuración de la configuración del usuario. SecurityProperties SecurityProperties; // procesador personalizado después de inicio de sesión exitoso @autewired private autenticationsuccesshandler imoutenticationsuccessHandler; // Autenticación personalizada Falló procesador @autowired privado autenticación privada // Tenga en cuenta que es org.springframework.security.crypto.password.passwordEncoder @Bean public PasswordEncoder contraseña Coder () {// bcRyptPassPassWordEncoder implementa contraseña de contraseña devolver nuevo bcRyptPassPassCooder (); } // Versión 2: Página de inicio de sesión configurable @Override Proteged void Configure (httpsecurity http) lanza la excepción {// ValidAteCodeFilter ValidAteCodeFilter ValidateCodeFilter = new ValidAteCodeFilter (); // Use su propio manejo de errores en el filtro de código de verificación a ValidAteCodeFilter.SetAuthenticationFailureHandler (imoOCAuthenticationFailureHandler); // Implementar la interfaz que necesita autenticación para saltar de inicio de sesión de formulario, seguridad = autenticación + autorización //http.httpbasic () // Este es el cuadro emergente predeterminado autenticación // http.addfilterbefore (validateCodeFilter, usernamePasswlautAuthenticationFilter.class) // cargar el filtro de código de verificación antes del filtro de código de registro antes del filtro de código antes del filtro de código de login ((((()//////////. autenticación.loginPage ("/autenticación/requisito") // Process User Autenticación BROWSERSECURITYCONTROLLER // Iniciar sesión Filter UserNamePassWderAuthenticationFilter La url de login predeterminada es "/login", que se puede cambiar aquí. Autenticación postprocessor.failureHandler (iMoocauthenticationFailureHandler) // Processing después de la falla de inicio de sesión.and () .authorizequests () // Las siguientes configuraciones autorizadas /// autenticación/requerir: manejar login, securityProperties.getBrowser (). getLogInpage (): user-configured loginininiRINIn Page.antMatchers ("/Authentication/require", SecurityProperties.getBrowser (). // La protección de la criptografía está apagada; }}Página de inicio de sesión: la página de inicio de sesión se realiza relativamente aproximadamente. De hecho, el código de verificación se puede verificar cuando la entrada del código de verificación pierde el enfoque. También puede usar una imagen de clic para actualizar la función del código de verificación, por lo que no lo haré aquí.
<Body> Página de inicio de sesión de demostración. <BR> <Form Action = "/Authentication/Form" Method = "Post"> <table> <tr> <TD> UserName: </td> <td> <input type = "text" name = "username"/> </td> <td> </td> </tr> <tr> <tr> <td> contraseña: </td> <td> <pass = "Nombre =" Nombre " <TD> </td> </tr> <tr> <td> Código de verificación: </td> <td> <input type = "text" name = "imageCode"/> </td> <td> <img src = "/verifyCode/image"/> </td> </tr> <tr> <td colspan = "2" align = "Right" <button "<bootin" Boton type = "enviar"> Login </boton> </td> </tr> </table> </form> </body>
Visite http: // localhost: 8080/demo-login.html:
Responder a la información de excepción personalizada
La función general no es un problema. Pero no es lo suficientemente universal, como el ancho y la altura de la imagen del código de verificación, el tiempo de vencimiento, la URL filtrada y la lógica del código de verificación se escriben hasta la muerte. Estos se pueden hacer vivos, y ahora se reflejan los beneficios de hacer códigos de verificación en un filtro. Podemos configurar URL que necesitan ser filtradas. A veces, no solo puede requerir códigos de verificación en la página de inicio de sesión, que es más general.
1. Los parámetros básicos del código de verificación para la modificación de la generalización se pueden combinar
Se convierte en configurable, y la aplicación se refiere al módulo y lo configura él mismo. Si no configura, use la configuración predeterminada. Además, la configuración se puede declarar en la URL de solicitud o en la aplicación. ¡El maestro es de hecho un maestro, y el código es muy versátil!
El efecto que quiero lograr es hacer dicha configuración en Application.Properties:
#VERIFICACIÓN DEL CÓDIGO DEL CÓDIGO DE IMAGEN, Altura, número de caracteres imooc.security.code.image.width = 100Imooc.security.code.image.height = 30Imooc.security.code.image.length = 6
Luego puede controlar el efecto del código de verificación. Debido a que el código de verificación también se divide en el código de verificación de imagen y el código de verificación SMS, puede usar un nivel .code.image, que utiliza el archivo de configuración personalizado de SpringBoot y debe declarar la clase Java correspondiente:
El atributo del código debe declararse en SecurityProperties:
paquete com.imooc.security.core.properties; import org.springframework.boot.context.properties.configurationProperties; import org.springframework.context.annotation.configuration;/*** Los elementos de configuración personalizados* ClassName: SecurityPperties* @Description: los elementos de configuración personalizados* esta clase de configuración de la clase. imooc.security en Application.Properties * * imooc.security.browser.loginPage = /Demo-Login.html * La configuración del navegador se leerá en BrowserProperties * Esto se divide por puntos, y el nivel y el nivel corresponden a los atributos de la clase * @author lihaoyang * @date 28, 2018*/@ConfigurationProperties (prefix = "imooc.security") public class SecurityProperties {private BrowserProperties Browser = new BrowserProperties (); Código privado de ValidAteCodeProperties = new ValidAteCodeProperties (); Public BrowserProperties getBrowser () {Browser de retorno; } public void setBrowser (navegador de navegación) {this.browser = browser; } public ValidAteCodeProperties getCode () {código de retorno; } public void setCode (validateCodeProperties Code) {this.code = code; }}ValidAteCodeProperties:
paquete com.imooc.security.core.properties;/*** Configuración del código de verificación* ClassName: ValidAteCodeProperties* @Description: Configuración del código de verificación, el código de verificación incluye código de verificación de imagen, código de verificación SMS, etc., por lo que se incluye una capa* @Author Lihaoy* @@Date March 2, 2018*/Clase pública Validación Validateprendas ImageDeProperties image = new imageCodeProperties (); Public ImageDeproperties getImage () {imagen de retorno; } public void setImage (imageCodeProperties Image) {this.image = image; }}ImageCodeProperties:
paquete com.imooc.security.core.properties;/*** Código de verificación de imagen Clase de configuración* ClassName: ImageDeProperties* @Description: Código de verificación de imagen Class de configuración* @author lihaoyang* @Date 2 de marzo de 2018*/public class ImageProperties {// Picture Width Private Int Width = 67; // Altura de la imagen Private int Height = 23; // Número de caracteres de código de verificación intivent int long = 4; // Tiempo de caducidad private int expirein = 60; public int getWidth () {Width de retorno; } public void setWidth (int width) {this.width = width; } public int getheight () {altura de retorno; } public void setheight (int altura) {this.height = altura; } public int getLength () {return longitud; } public void setLength (int long) {this.length = longitud; } public int getEptirein () {return expireIn; } public void setEppirein (int expirein) {this.eptirein = expireIn; }}Para la configuración de nivel de solicitud, si la solicitud contiene los parámetros del código de verificación, use la solicitud:
El método CreateImageCode de ValidateCodeController se usa para controlarlo para determinar si los parámetros de solicitud tienen estos parámetros. Si es así, se pasa a la clase de generación de código de verificación VerifyCode, que puede controlarse dinámicamente durante la generación.
Private ImageCode createImageCode (solicitud de httpservletRequest, respuesta httpservletResponse) {// leer por primera vez los parámetros de longitud, ancho y número de los caracteres de la solicitud, si hay, usa it, y el intalft = servletRequestUtils.getIntparameter (solicitud, "width", SecurityProperties.getCode (). int hight = ServLetRequestUtils.getIntParameter (solicitud, "altura", SecurityProperties.getCode (). getImage (). Getheight ()); int charlength = this.securityProperties.getCode (). getImage (). getLength (); VerifyCode VerifyCode = new VerifyCode (ancho, altura, charlength); return nuevo ImageCode (VerifyCode.getImage (), VerifyCode.Gettext (), this.securityProperties.getCode (). getImage (). getEppireIn ()); }VerifyCode:
public verifycode (int w, int h, int charlength) {super (); this.w = w; this.h = h; this.charlength = CharLength; }Experimento: realice la configuración de nivel de aplicación en el proyecto de demostración
Inicie sesión en el formulario para hacer la configuración de nivel de solicitud
<img src = "/verifycode/image? width = 200"/>
acceso:
La longitud es el parámetro 200 de la banda de escenario solicitante, la altura es 30 y los caracteres están configurados 6.
2. La interfaz para la intercepción del código de verificación de la modificación universal se puede configurar
El primer efecto es configurar dinámicamente las interfaces que necesitan ser interceptadas en application.properties .
ImageCodeProperties ha agregado un nuevo atributo: private String url ; // La URL interceptada es coincidir con la configuración de la imagen anterior.
Core, el filtro de código de verificación debe modificarse:
1. Declare un conjunto de conjunto en el interceptor para almacenar las URL configuradas en el archivo de configuración que necesita ser interceptado.
2. Implemente la interfaz InitializingBean. Propósito: Cuando se ensamblen todos los demás parámetros, inicialice el valor de las URL que deben interceptarse y reescribir el método AfterPropertIesset para implementarlo.
3. Inyecte SecurityProperties y lea el archivo de configuración
4. Instanciar la clase de herramientas AntpathMatcher, que es una combate
5. Establezca el navegador de seguridad en el proyecto del navegador para llamar al método AfterPropertIesset.
6. Configure la URL que se filtrará en la aplicación. Properties del proyecto de demostración que hace referencia al módulo.
ValidAteCodeFilter:
/** * Procese el filtro de código de verificación de inicio de sesión * ClassName: ValidAteCodeFilter * @Description: * Heredar las herramientas proporcionadas por OnceperRequestFilter: Spring para asegurarse de que el filtro se llame solo una vez cada vez * Implemente el propósito de la interfaz de Inicializadora: * Cuando otros parámetros son ensamblados, inicializar el valor de las urls que deben intervenir * @@Author lihayang * 2018*/Clase pública ValidAteCodeFilter se extiende una vez porRequestFilter implementos inicializingBean {// autenticación fallida procesador autenticación privadaFailureHandler AutenticationFailureHandler; // Obtener clase de sesión de sesión SessionStrategy sessionStrategy = new httpSessessionStrategy (); // La colección de URL que necesita ser interceptada establecida privada <String> urls = new Hashset <> (); // Leer Configuración SecurityProperties SecurityProperties de seguridad; // Clase de herramienta de primavera AntpathMatcher antpathMatcher = new AntPathMatcher (); @Override public void AfterPropertIesset () lanza ServletException {super.afterPropertIesset (); // Lea las URL de la cadena interceptada configurada [] configuratls = stringUtils.splitbyWholeseParatorPreServeAllTokens (SecurityProperties.getCode (). GetImage (). GetURL (), ","); for (String Configurl: Configurls) {URLS.Add (configuratl); } // Las solicitudes de inicio de sesión deben interceptar URLS.Add ("/Autenticación/Forma"); } @Override protegido doFilterInternal (HTTPServletRequest Solicitud, respuesta HttpServletResponse, FilterChain FilterChain) lanza ServletException, IOException { / *** VERIFICACIÓN DE CÓDIGO DE VERIFICACIÓN CONFIGRADA* Determinar si la URL solicitada y la URL configurada coinciden con el filtro, Filter si coincide con la acción* / boolean = falso; for (string url: urls) {if (antpathmatcher.match (url, request.getRequesturi ())) {action = true; }} if (acción) {try {validate (new ServletWebRequest (request)); } Catch (ValidateCodeeException e) {// llamando al controlador de errores, y finalmente llamando a su propia autenticaciónfailureHandler.AntoneuthenticationFailure (solicitud, respuesta, e); return; // finalizando el método, ya no llama a la cadena de filtro}} // no es una solicitud de inicio de sesión, llame a otras cadenas de filtro filtreChain.dofilter (solicitud, respuesta); } // omitir código irrelevante ,,}NaveRerseCurityConfig:
Configurar URL:
#Configuración de interfaz de intercepción de código de verificación imooc.security.code.image.url =/user,/user/*
Prueba: /usuario /usuario /1 fue interceptado
Visite la página de inicio de sesión sin escribir código de verificación:
Consistente con las expectativas. En este punto, se completa la configuración dinámica de la interfaz de intercepción
3. La lógica de generación de código de verificación puede ser configurable
Los programas mejor escritos generalmente tienen interfaces abiertas, lo que permite a los usuarios personalizar la implementación. Si no se implementan, use la implementación predeterminada. Hagamos esto para que la generación de códigos de verificación pueda ser implementado por sí mismos. Si desea que la lógica de generación de código de verificación sea configurable, no puede simplemente escribir una clase del generador de código de verificación de imagen. Debe extraer la generación de código de verificación en una interfaz ValidAteCodeGenerator, un método para generar generador de código de verificación (). Debido a que el código de verificación también tiene código de verificación de imagen, código de verificación SMS, etc., hacemos una implementación predeterminada en nuestro módulo de verificación, como la implementación del código de verificación de imágenes ImageCodeGenerator. En ImageCodeGenerator, no agregamos la anotación de @Component a esta clase. Luego use la clase de configuración ValidAteCodeBeanConfig que escribe un código de código de verificación. Esta clase de configuración configura varios frijoles de implementación de código de verificación requeridos, como la implementación del código de verificación de imágenes ImageCodegenerator, el código de verificación de SMS, etc. Sus tipos de retorno son todos validatecodeGenerator. Use la anotación @conditionalonmissingbean (name = "imageCodeGenerator"). Se puede juzgar que si el contenedor de primavera actual tiene un frijol llamado ImageCodeGenerator, se utilizará, y si no hay configuración, por lo que si otros se refieren a su módulo, si otros implementan el código de verificación para generar la interfaz ValidatEcodeGenerator, configuran el nombre de la clase de implementación para ser ImagenGenerator y usan su propia implementación, por lo que el programa es extensible.
Código principal:
Interfaz del generador de código ValidAteCodeGenerator:
paquete com.imooc.security.core.validate.code; import org.springframework.web.context.request.servletwebrequest;/** * interfaz de generación de código de verificación * classname: validateCodeGenerator * @Description: TODO * @author lihayang * @Date March 2, 2018 */público. / ** * Interfaz de generación de código de verificación de imagen * @Description: TODO * @param @param request * @param @return * @return imageCode * @throws * @author lihaoyang * @date 2 de marzo de 2018 * / generador de imageCode (ServletWebRequest);}
El generador de código de verificación de imagen implementa ImageCodeGenerator:
paquete com.imooc.security.core.validate.code; import org.springframework.beans.factory.annotation.aUtowired; import org.springframework.stereotype.component; import org.springframework.web.bind.servletrequutils; import org.springframework.web.context.request.servletwebRequest; import com.imooc.security.core.properties.securityproperties;/** * Generación de código de verificación de imagen Class * className: ImageCodeGenerator * @Description: toDo * @author lihaoyang * @Date March 2, 2018 */class de califa * implementa validateCodeGenerator {@aUtowired SecurityProperties SecurityProperties; @Override public ImageCode Generator (ServletWebRequest Solicitud) {// Leer primero de la solicitud si hay parámetros de longitud, ancho y caracteres. Si lo hay, úselo y el intemperable int width = ServLetRequestUtils.getIntParameter (request.getRequest (), "Width", SecurityProperties.getCode (). GetImage (). GetWidth ()); int hight = ServLetRequestUtils.getIntParameter (request.getRequest (), "altura", SecurityProperties.getCode (). getImage (). Getheight ()); int charlength = this.securityProperties.getCode (). getImage (). getLength (); VerifyCode VerifyCode = new VerifyCode (ancho, altura, charlength); return nuevo ImageCode (VerifyCode.getImage (), VerifyCode.Gettext (), this.securityProperties.getCode (). getImage (). getEppireIn ()); } public SecurityProperties getSecurityProperties () {return SecurityProperties; } public void setSecurityProperties (SecurityProperties SecurityProperties) {this.SecurityProperties = SecurityProperties; }}ValidAteCodeBeanConfig:
paquete com.imooc.security.core.validate.code; import org.springframework.beans.factory.annotation.autewired; import org.springframework.boot.autoconfigure.condition.condition.condition.condition.condition.condition.onmissingbean; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import com.imooc.security.core.properties.securityproperties;/** * Configure el bean de la clase de implementación real del validateCodeGenerator * className: Configure el bean de la clase de implementación real del validatecodeGenerator *, como la implementación del código de verificación de imagen y la implementación del código de verificación SMS * @author lihaoyang * @Date 5 de marzo de 2018 */ @ConfigurationPublic Class ValidateTeCodeBeanConfig {@autowered Seguridad privada Seguridad Propperties; /** * @Description: * @conditionalonmissingbean anotación significa que cuando el contenedor de primavera no tiene un imageCodeGenerator, la función es hacer que el programa sea más extensible. La clase de configuración está configurada en el módulo Core. Esto significa que si el proyecto que se refiere al módulo * tiene su propia implementación, lo que implementa la interfaz ValidatEcodeGenerator y define su propia implementación. El nombre también se llama ImageCodeGenerator, * se usa para implementar la implementación de nivel de aplicación, y si no existe tal implementación, use esta implementación predeterminada. * @param @return * @return validateCodeGenerator * @throws * @author lihaoyang * @Date 5 de marzo de 2018 */ @Bean @conditionAlonMissingBean (name = "ImageCodeGenerator") public ValidAdeGenerator ImageGenerator () {CodeGenerator CodeGenerator = New ImageDegenerator (); CodeGenerator.SetSecurityProperties (SecurityProperties); return Codegenerator; }}De esta manera, si un módulo se refiere a este módulo de código de verificación, personaliza la implementación, como:
paquete com.imooc.code; import org.springframework.stereotype.component; import org.springframework.web.context.request.servletwebrequest; import com.imooc.security.core.validate.code.imagecode; import; com.imooc.security.core.validate.code.validateCodeGenerator; @Component ("ImageCodeGenerator") public class DemoImageCodeGenerator implementa ValidateCodeGenerator {@Override Public ImageDode Generator (ServletWebrequest Solicitud) {System.err.err.Rerr.Println ("Generado VER VER VER VERSEVECETATed regresar nulo; }}De esta manera, cuando ValidateCodeBeanConfig configura el código de verificación Bean, utilizará la implementación personalizada del usuario.
El código completo se coloca en Github: https://github.com/lhy1234/spring-security
Resumir
El anterior es el código de ejemplo de la función del código de verificación de imagen de seguridad de Spring que le presenta 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!