需求场景
Spring服务中,由于业务调整,部分API只针对高版本移动APP开放,低版本APP不允许访问,并提示用户升级应用。不排除在某些场景,部分API只在某个时间段开放,之后进行关闭。
实现方案
利用Spring AOP特性,自定义注解,作用于controller类或者类名下的请求方法,进行请求拦截,使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
实施过程
第一步,自定义注解。
package org.oriboy.mock.annotation;
import java.lang.annotation.*;
/**
* api 版本号拦截
* eg: min=3.1.2 表示可访问版本号必须大于或者等于3.1.2
* eg:max=3.1.2,表示可访问版本号必须小于或者等于3.1.2
* eg: min=3.1.2,max=3.2.2,表示可访问版本号在3.1.2到3.2.2区间
* eg: start=2021-03-16 12:00,表示可访问时间必须大于或者等于2021-03-16 12:00
* eg: end=2021-03-16 12:00,表示可访问时间必须小于或者等于2021-03-16 12:00
* eg: start=2021-03-16 12:00,end=2021-03-17 12:00,表示可方式时间在2021-03-16 12:00到2021-03-16 12:00之间
* @author rocky
* @date 2021/3/18 22:43
*/
@Target({
ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface ApiVersion {
/**
* 允许访问最小版本
* @return String
*/
String min() default "1.0.0";
/**
* 允许访问最大版本
* @return String
*/
String max() default "";
/**
* 允许访问时间开始区间,格式支持[yyyy-MM-dd]和[yyyy-MM-dd HH:mm]
* @return String
*/
String start() default "";
/**
* 允许访问时间结束区间,格式支持[yyyy-MM-dd]和[yyyy-MM-dd HH:mm]
* @return
*/
String end() default "";
}
第二步,编写切面处理类。
package org.oriboy.mock.aspect;
import org.oriboy.mock.annotation.ApiVersion;
import org.oriboy.mock.common.utils.CommonUtils;
import org.oriboy.mock.exception.ValidatorException;
import lombok.extern