控制 Swagger 访问的动态过滤器实现
在现代 Web 应用开发中,为了安全性和便捷性,经常需要在不同的环境下动态控制 API 文档页面的访问。本文将解读一段 Java 代码,展示如何通过一个自定义的过滤器来控制 Swagger 文档的访问权限。
背景
Swagger 是一个流行的 API 文档生成工具,但在生产环境中,通常我们不希望所有用户都能访问这些文档。通过动态配置信息来控制 Swagger 页面的访问,可以帮助提升应用的安全性。
代码实现
以下代码片段展示了如何使用 Java 过滤器来实现这个功能:
import javax.annotation.Resource;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.XXX.biz.util.VteDetectUtil;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
/*
* @Author: meowQAQ
* @Date: 2/20/2025
* @Description: 通过过滤器动态控制Swagger文档访问
*/
@Component
@WebFilter("/*")
public class SwaggerAccessFilter implements Filter {
@Resource
private VteDetectUtil vteDetectUtil;
@Resource
private Environment environment;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 从数据库或其他配置源读取开关配置
Boolean enable = "1".equals(vteDetectUtil.getConfigurationByKey("enable_swagger"));
// 获取应用程序的上下文路径
String contextPath = environment.getProperty("server.servlet.context-path", "");
// 将请求和响应对象转化为HTTP协议特有的对象
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 获取请求的实际路径
String path = httpRequest.getRequestURI();
// 检查请求路径是否为Swagger文档页面
if (path.startsWith(contextPath + "/doc.html")) {
// 如果Swagger未启用,返回403 Forbidden
if (!enable) {
httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}
}
// 如果Swagger启用或不是针对文档的请求,继续处理请求
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化过滤器配置
}
@Override
public void destroy() {
// 销毁过滤器时的操作
}
}
代码解读
-
资源注入:通过
@Resource
注解注入VteDetectUtil
类用于获取配置信息,Environment
用于读取应用的环境变量,特别是上下文路径。 -
路径匹配和访问控制:在处理请求时,过滤器会检查请求路径是否为 Swagger 文档页面(
/doc.html
开头)。如果 Swagger 功能在配置中被禁用,则会返回 HTTP 403 Forbidden 状态,阻止访问。 -
上下文路径:通过
Environment
获取应用的server.servlet.context-path
配置,确保路径匹配处理在任何上下文路径下都准确。 -
过滤器生命周期:重写
init()
和destroy()
以处理过滤器的初始化和销毁,但目前实现中没有额外的操作。