Registre una implementación simple para agregar conmutadores al archivo de configuración

Registre una implementación simple para agregar conmutadores al archivo de configuración

Descripción de la escena:

Agregue un tiempo de uso al programa. Después de unos días, el programa no será accesible normalmente.

Posible implementación:

1. Cuando se inicia el programa, se inicia una tarea programada y el programa se destruye después del tiempo especificado. Sin embargo, si el programa se reinicia... todavía necesita algún código de tarea programada. Si no puede escribirlo, no No lo escribas. Repasémoslo primero.

2. Agregue una clave para redis y agregue un tiempo de vencimiento a la clave;

Cuando se inicia el programa (al cargar beans), agregue una clave a redis y establezca el tiempo de vencimiento. Cuando el programa se reinicia dentro del tiempo de vencimiento, si existe esta clave, no se agregará a redis;

Los dos métodos anteriores tienen errores, pero por el momento sólo puedo resolverlos de esta manera.

Registremos el método de implementación por ahora:

Interruptores de configuración

Agregar un interruptor al archivo de configuración

Agregar una etiqueta de precio al archivo de configuración indica si se deben habilitar funciones específicas.

iniciar sesión: verdadero

Luego verifique si el interruptor del archivo de configuración está activado:

Implementado mediante anotaciones en primavera:

import com.hmrs.filter.LoginFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LoginFilterWebConfig {

 @LoginTaskConditionOnProperTy(value = "login" ,havingValue = "true")
    @Bean
    public LoginFilter buildFilter() {
        return new LoginFilter();
    }
}

Si existe esta configuración en el archivo de configuración y el valor es verdadero, significa activar este filtro;

¿Por qué activar este filtrado?-----Solicitud de interceptación:

La condición para la interceptación es si hay una clave especificada en redis.

Personalizar una anotación

import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(LoginFilterCondition.class)
public @interface LoginTaskConditionOnProperTy {
    String value();
    String prefix() default "";
    String havingValue() default "";
    boolean matchIfMissing() default false;
    boolean relaxedNames() default true;
}

¿Cómo es el filtro?

import com.alibaba.fastjson2.JSONObject;
import com.hmrs.comm.BaseResult;
import com.hmrs.service.RedisRWService;
import com.hmrs.util.HmrsUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Gavin
 */
@Slf4j
public class LoginFilter implements Filter {

    @Autowired
    private RedisRWService redisRWService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        if (redisRWService.hasKey("Gavin")){
            log.info("redis中已有key");
        }else{
            log.info("设置redis的key");
            redisRWService.saveObjData("Gavin", "Gavin");
            redisRWService.setKeyExpireTime("Gavin", 72);
        }

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       if (request instanceof HttpServletRequest){
           if (redisRWService.hasKey("Gavin")) {
               log.info("Gavin过滤器已生效");
               chain.doFilter(request, response);
           } else {
               log.info("Gavin过滤器已失效");
               BaseResult baseResult = HmrsUtils.setHttpBaseResult(400, "failed", "接口已失效");
               HmrsUtils.returnJson((HttpServletResponse) response, JSONObject.toJSONString(baseResult));
               return;
           }
       }else{
           return ;
       }

    }

    @Override
    public void destroy() {

    }
}

Después de tener el filtro, necesitamos inyectar este filtro para que sea efectivo:

import com.hmrs.filter.LoginFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;



//@ConditionalOnProperty(prefix = "login", name = "enable", havingValue = "true")
@Configuration
public class LoginFilterWebConfig {

    /**
     * 注册LoginFilter
     *
     * @return 返回实例
     */
    @LoginTaskConditionOnProperTy(value = "login" ,havingValue = "true")
    @Bean
    public LoginFilter buildFilter() {
        return new LoginFilter();
    }
}

La pregunta es ¿cuándo entrará en vigor? Esto lo controlamos nosotros. Si agregamos anotaciones directamente al LoginFilterWebConfig anterior

@ConditionalOnProperty(prefijo = “iniciar sesión”, nombre = “habilitar”, haveValue = “verdadero”)

Dado que Spring lo administra por sí solo, no sigue lo que queremos. En pocas palabras, el filtro tendrá efecto independientemente de si el interruptor está activado o no, por lo que debemos personalizar una anotación y luego inyectar este filtro LoginFilter bajo ciertos condiciones.

Al personalizar la anotación LoginTaskConditionOnProperTy, necesitamos importar una clase: LoginFilterCondition; es decir, con esta anotación, si el bean está cargado se personalizará de acuerdo con la situación coincidente en la clase importada mediante imprt:

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.util.MultiValueMap;

import java.util.List;

public class LoginFilterCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        MultiValueMap<String, Object> allAnnotationAttributes = metadata.getAllAnnotationAttributes(LoginTaskConditionOnProperTy.class.getName());
        List<Object> objectList = allAnnotationAttributes.get("value");
        List<Object> havingValue = allAnnotationAttributes.get("havingValue");
        String property = context.getEnvironment().getProperty((String) objectList.get(0));
        if (property.equals(havingValue.get(0))){
            return true;
        }
        return false;
    }
}

Finalmente, después de encender el interruptor:

com.hmrs.filter.LoginFilter: la clave ya existe en redis

Después de apagar el interruptor: el bean de esta clase no está cargado.

Supongo que te gusta

Origin blog.csdn.net/weixin_54061333/article/details/132054053
Recomendado
Clasificación