当前位置: 首页 > news >正文

做外贸英文网站哪家好做阅读任务挣钱的网站

做外贸英文网站哪家好,做阅读任务挣钱的网站,最新国际热点新闻,台州新农村建设网站环境#xff1a;SpringBoot2.7.12 1. 概述 本文将介绍如何为API接口动态添加开关功能。通过这个功能#xff0c;我们可以控制API接口的正常访问或显示提示信息。这有助于在开发和维护过程中更好地管理和控制API接口的行为。通过使用开关功能#xff0c;我们可以轻松地在不同… 环境SpringBoot2.7.12 1. 概述 本文将介绍如何为API接口动态添加开关功能。通过这个功能我们可以控制API接口的正常访问或显示提示信息。这有助于在开发和维护过程中更好地管理和控制API接口的行为。通过使用开关功能我们可以轻松地在不同情况下调整接口的行为提高系统的灵活性和可维护性。 为什么要给API接口添加开关功能呢从以下几方面考虑 灵活性和可扩展性我们可以根据需要动态地控制API接口的行为。这使得在面对不同场景和需求时可以更加灵活地调整接口的行为而无需对代码进行修改。安全性和控制有时我们可能不希望在特定情况下API接口被正常访问例如在测试、维护或敏感数据访问等场景下。通过关闭开关并显示提示信息我们可以对用户进行必要的通知和引导确保接口不被未经授权的访问。错误处理和日志记录当API接口出现错误或异常时关闭开关并显示提示信息可以帮助我们更好地追踪和记录问题。这对于后续的问题排查和系统优化非常有帮助。系统监控和管理通过监控开关状态的变化我们可以了解系统的运行状况以及用户对API接口的使用情况。这有助于进行系统性能优化和资源管理。用户体验在某些情况下当API接口不可用或需要维护时向用户显示友好的提示信息可以避免用户感到困惑或带来不必要的困扰。同时提前通知用户也体现了对用户体验的关注。合规性和隐私保护在涉及敏感数据或受限制的API接口中通过关闭开关并显示提示信息可以确保遵守相关法规和隐私政策对数据进行适当的管理和保护。 2. 实现方案 首先定义一个AOP切面Aspect该切面负责控制接口(Controller)的开关行为。 在切面中我们可以使用Spring AOP的切入点Pointcut来指定需要拦截的方法。一旦方法被拦截我们可以在切面的通知Advice中定义相应的默认行为。接下来我们将一步一步的实现接口开关功能。 自定义注解 Target({ElementType.TYPE, ElementType.METHOD}) public interface ApiSwitch {/**接口对应的key通过可以该key查询接口是否关闭*/String key() default ;/**解析器beanName通过具体的实现获取key对应的值*/String resolver() default ;/**开启后降级方法名*/String fallback() default ;} 定义解析器接口 public interface SwitchResolver {boolean resolver(String key) ;public void config(String key, Integer onoff) ;} 接口默认实现 Component public class ConcurrentMapResolver implements SwitchResolver {private MapString, Integer keys new ConcurrentHashMap() ;Overridepublic boolean resolver(String key) {Integer value keys.get(key) ;return value null ? false : (value 1) ;}public void config(String key, Integer onoff) {keys.put(key, onoff) ;} } 基于redis实现 Component public class RedisResolver implements SwitchResolver {private final StringRedisTemplate stringRedisTemplate ;public RedisResolver(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate ;}Overridepublic boolean resolver(String key) {String value this.stringRedisTemplate.opsForValue().get(key) ;return !(value null || 0.equals(value)) ;}Overridepublic void config(String key, Integer onoff) {this.stringRedisTemplate.opsForValue().set(key, String.valueOf(onoff)) ;} } 这里就提供两种默认的实现。 定义切面 Component Aspect public class ApiSwitchAspect implements ApplicationContextAware {private ApplicationContext context ;private final SwitchProperties switchProperties ;public static final MapString, Class? extends SwitchResolver MAPPINGS;static {// 初始化所有的解析器MapString, Class? extends SwitchResolver mappings new HashMap() ;mappings.put(map, ConcurrentMapResolver.class) ;mappings.put(redis, RedisResolver.class) ;MAPPINGS Collections.unmodifiableMap(mappings) ;}public ApiSwitchAspect(SwitchProperties switchProperties) {this.switchProperties switchProperties ;}Pointcut(annotation(apiSwitch))private void onoff(ApiSwitch apiSwitch) {}Around(onoff(apiSwitch))public Object ctl(ProceedingJoinPoint pjp, ApiSwitch apiSwitch) throws Throwable {// 对应接口开关的keyString key apiSwitch.key() ;// 解析器bean的名称String resolverName apiSwitch.resolver() ;// 降级方法名String fallback apiSwitch.fallback() ;SwitchResolver resolver null ;// 根据指定的beanName获取具体的解析器;以下都不考虑不存在的情况if (StringUtils.hasLength(resolverName)) {resolver this.context.getBean(resolverName, SwitchResolver.class) ;} else {resolver this.context.getBean(MAPPINGS.get(this.switchProperties.getResolver())) ;}// 解析器不存在则直接调用目标接口if (resolver null || !resolver.resolver(key)) {return pjp.proceed() ;}// 调用降级的方法关于降级的方法简单点都必须在当前接口类中同时还不考虑方法参数的情况if (!StringUtils.hasLength(fallback)) {// 未配置的情况return 接口不可用 ;}Class? clazz pjp.getSignature().getDeclaringType() ;Method fallbackMethod clazz.getDeclaredMethod(fallback) ;return fallbackMethod.invoke(pjp.getTarget()) ;}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context applicationContext ;}} 修改开关接口 GetMapping(/onoff/{state}) public Object onoff(String key, PathVariable(state) Integer state) {String resolverType switchProperties.getResolver();if (!StringUtils.hasLength(resolverType)) {SwitchResolver bean this.context.getBean(ApiSwitchAspect.MAPPINGS.get(map)) ;if (bean instanceof ConcurrentMapResolver resolver) {resolver.config(key, state) ;}} else {SwitchResolver resolver this.context.getBean(ApiSwitchAspect.MAPPINGS.get(resolverType)) ;resolver.config(key, state) ;}return success ; } 通过该接口修改具体哪个接口的开关状态。注意这里有小问题如果接口上指定了resolver类型且配置文件中指定的类型不一致就会出现不生效问题。这个问题大家可以自行解决 接下来进行测试 GetMapping(/q1) ApiSwitch(key swtich$q1, fallback q1_fallback, resolver redisResolver) public Object q1() {return q1 ; }public Object q1_fallback() {return 接口维护中 ; } 这是完整的配置示例这里除了key必须外其它的都可以不填写。 具体测试结果就不贴了大家可以自行测试基于jvm内存和redis的方式。 总结通过上述介绍我们可以看到使用Spring AOP实现接口的开关功能是一种非常有效的方法。通过定义AOP切面和切入点我们可以精确地拦截需要控制的方法并在通知中根据开关状态执行相应的逻辑。这种技术手段有助于提高代码的可维护性和可扩展性同时提供更好的灵活性和控制性来管理接口的行为
http://www.pierceye.com/news/727375/

相关文章:

  • 浙江省建设诚信系统网站网上购物哪个网站最好
  • 做网站电销和生活爱辽宁下载安装
  • 安监网站安全建设信息wordpress电影影视主题
  • 网站打不开服务器错误网站怎么设置支付
  • 做网站的宽度为多少云南省建设工程信息服务平台
  • 网站优化公司大家好桂林网络搭建
  • 做a漫画在线观看网站网站建设这个工作怎么样
  • 商城网站建设缺点培训机构退费
  • 大型网站需要什么样的团队建购物网站 教程
  • 商业设计网站推荐网站注册免费qq
  • 做微信首图的网站阿里网站建设App开发
  • .网站链接策略网页制作手机版
  • 河南网站优化要多少钱网站技术有哪些
  • 域名还在备案可以做网站吗高端设计公司名字大全
  • 简洁的门户网站网站开发文案
  • 信息网站 模板中国建设银行手机银行下载官方网站
  • 番禺网站开发设计小程序后端数据库搭建
  • 丰都集团网站建设云南网站开发公司
  • 赶集网的二级域名网站怎么做海南网站建设报价方案
  • dede做手机网站网站开发小作业
  • 网站建设推广ppt室内设计知名网站
  • asp 网站源码网站搭建好了怎么上到服务器
  • 网站有什么到期wordpress怎么编辑保存
  • 服务器添加网站300500启迪设计
  • 上海市建设安全协会网站移动端页面
  • 手机做网站公司成都住房和城乡建设厅官网
  • 锋创科技园网站建设网站开发ide php
  • 山东做网站的公司有哪些电脑怎么制作视频短片
  • 书画网站 建站维护网站成本
  • 什么事网站开发网站服务器租用报价