package com.ruoyi.task.config; import com.ruoyi.common.exception.ServiceException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 任务模块开关拦截器。 *

* 作用:当开关关闭({@code sys_config} 中 {@code task.enabled=false})时, * 命中任务端点的请求会被立即拦下并抛出 {@link ServiceException}, * 由 RuoYi 的全局异常处理器返回明确的业务错误提示(而不是 404 或静默返回空数据)。 *

* 开关值由 {@link TaskSwitch} 在运行时读取({@code sys_config},10 秒进程内缓存), * 因此改完参数设置不需要重启,最多 10 秒即生效。 *

* 为什么不用 {@code @ConditionalOnProperty} 让 Controller 直接不注册: *

*

* 为什么不会影响其它业务与启动:本拦截器只登记在任务模块的 * 2 个 URL 前缀上(见 {@link TaskWebConfig}),不会碰到随访/问卷/其它接口。 */ @Slf4j @Component public class TaskAvailabilityInterceptor implements HandlerInterceptor { /** * 模块被关闭时返回给调用方的错误提示(前端可直接展示) */ public static final String DISABLED_MESSAGE = "任务功能未启用(参数配置 task.enabled=false),该接口不可用"; private final TaskSwitch taskSwitch; public TaskAvailabilityInterceptor(TaskSwitch taskSwitch) { this.taskSwitch = taskSwitch; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (!taskSwitch.isEnabled()) { // request 允许为 null(单元测试直接调 preHandle 时不构造请求对象) String method = request == null ? "-" : request.getMethod(); String uri = request == null ? "-" : request.getRequestURI(); log.warn("【任务】模块已关闭(参数配置 task.enabled=false),拒绝访问 {} {}", method, uri); throw new ServiceException(DISABLED_MESSAGE); } return true; } }