如何在WSO2 API Manager与Integrator Studio限制API非工作时段调用?
限制WSO2 API Manager/Integrator Studio中API的非工作时段调用方法
一、WSO2 API Manager 实现方案
1. 自定义中介拦截请求
直接写个中介脚本判断当前时间是否在工作时段,把它加到API的入流里就行:
- 打开API Publisher,找到目标API的「Manage」→「Mediations」,在入流里添加Script Mediator,用Groovy或JS写时间判断逻辑。
- 示例Groovy脚本:
import java.util.Calendar; Calendar cal = Calendar.getInstance(); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); int hour = cal.get(Calendar.HOUR_OF_DAY); // 定义工作时段:周一到周五(对应Calendar的1-5),9:00-18:00 boolean isWorkingHours = (dayOfWeek >= Calendar.MONDAY && dayOfWeek <= Calendar.FRIDAY) && (hour >=9 && hour <18); if(!isWorkingHours){ mc.setProperty("HTTP_SC", "503"); mc.setPayloadJSON('{"error": "服务仅在工作时段可用"}'); mc.getCalloutSequence().mediated(mc); return; }
保存发布后,非工作时段调用会直接返回503错误。
2. 用高级节流策略限制
针对订阅的应用设置时间窗口节流:
- 进入API Publisher的「Subscriptions」标签,给目标应用的订阅创建自定义节流策略:设置工作时段允许无限调用,非工作时段允许0次调用。
- 绑定策略后,非工作时段的请求会触发节流,返回429或自定义错误提示。
二、WSO2 Integrator Studio 实现方案
1. 在代理服务里加时间判断逻辑
打开代理服务的中介流设计器,添加Script Mediator写时间判断:
- 如果不在工作时段,直接返回错误并终止流程,示例中介序列配置:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="CheckWorkingHours"> <script language="groovy"> import java.util.Calendar; Calendar cal = Calendar.getInstance(); int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); int hour = cal.get(Calendar.HOUR_OF_DAY); // 周一到周五是2-6(Calendar里周日是1),9点到18点 boolean isWorkingHours = (dayOfWeek >= 2 && dayOfWeek <=6) && (hour >=9 && hour <18); if(!isWorkingHours){ mc.setProperty("HTTP_SC", "503"); mc.setPayloadJSON('{"error": "服务仅在工作时段提供"}'); send(); terminate(); } </script> </sequence>
把这个序列加到代理服务的入流,部署后就生效了。
2. 定时任务启停服务
如果需要完全禁用服务,用任务调度器定时启停:
- 写个任务类,实现工作时段启动服务、非工作时段停止服务的逻辑。
- 在Integrator Studio里配置任务触发时间:比如每天9:00执行启动任务,18:00执行停止任务。
内容的提问来源于stack exchange,提问作者Ehsan
相关产品推荐
相关产品推荐

