구성 파일에 스위치를 추가하는 간단한 구현을 기록합니다.

구성 파일에 스위치를 추가하는 간단한 구현을 기록합니다.

장면 설명:

프로그램에 사용 시간을 추가하면 며칠이 지나면 프로그램에 정상적으로 접속할 수 없게 됩니다.

가능한 구현:

1. 프로그램이 시작되면 예약된 작업이 시작되고 지정된 시간이 지나면 프로그램이 소멸됩니다. 그러나 프로그램을 다시 시작하면... 여전히 예약된 작업 코드가 필요합니다. 작성할 수 없는 경우에는 사용하지 마세요. 쓰지 말고 먼저 살펴보겠습니다.

2. Redis에 키를 추가하고 키에 만료 시간을 추가합니다.

프로그램 시작 시(Bean 로딩 시) Redis에 키를 추가하고 만료 시간을 설정하며, 만료 시간 내에 프로그램을 재시작할 때 이 키가 있으면 Redis에 추가되지 않습니다.

위의 두 방법 모두 버그가 있지만 현재로서는 이 방법으로만 해결할 수 있습니다.

지금은 구현 방법을 기록해 보겠습니다.

구성 스위치

구성 파일에 스위치 추가

구성 파일에 가격표를 추가하면 특정 기능을 활성화할지 여부가 표시됩니다.

로그인: 사실

그런 다음 구성 파일 스위치가 켜져 있는지 확인하십시오.

봄에 주석을 통해 구현되었습니다.

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();
    }
}

구성 파일에 이 구성이 있고 값이 true인 경우 이는 이 필터를 켜는 것을 의미합니다.

이 필터링을 켜는 이유는 무엇입니까?------차단 요청:

차단 조건은 Redis에 지정된 키가 있는지 여부입니다.

주석 사용자화하기

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;
}

필터는 어떻게 생겼나요?

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() {

    }
}

필터를 만든 후에는 이 필터를 삽입하여 필터를 효과적으로 만들어야 합니다.

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();
    }
}

문제는 언제부터 적용되는가 입니다. ​​이것은 당사에서 관리합니다. 위의 LoginFilterWebConfig에 주석을 직접 추가하면

@ConditionalOnProperty(prefix = “login”, name = “enable”, hadValue = “true”)

Spring이 자체적으로 관리하기 때문에 우리가 원하는대로 따르지 않습니다. 간단히 말해서 필터는 스위치가 켜져 있는지 여부에 관계없이 적용되므로 주석을 사용자 정의한 다음 특정 필터에 LoginFilter를 삽입해야 합니다. 정황.

LoginTaskConditionOnProperTy 주석을 사용자 정의할 때 LoginFilterCondition 클래스를 가져와야 합니다. 즉, 이 주석을 사용하면 임포트를 통해 가져온 클래스에서 일치하는 상황에 따라 Bean이 로드되는지 여부가 사용자 정의됩니다.

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;
    }
}

마지막으로 스위치를 켠 후:

com.hmrs.filter.LoginFilter - 키가 이미 Redis에 존재합니다.

스위치를 끈 후: 이 클래스의 Bean이 로드되지 않습니다.

추천

출처blog.csdn.net/weixin_54061333/article/details/132054053