使用 Servlet 和 Servlet 过滤器
Spring Cloud Gateway Server MVC 专为基于 Servlet API 构建并部署到 Servlet 容器的 Servlet 栈 Web 应用程序而设计。如果你的应用程序使用 Servlet 或 Servlet 过滤器,你可能需要注意它们的顺序。
由于Servlet容器处理请求参数的方式,当Spring WebMVC应用程序接收到application/x-www-form-urlencoded内容类型时,Servlet容器会将这些参数与查询参数合并为"请求"参数。Spring Cloud Gateway Server MVC包含一个特殊的FormFilter bean,用于为下游应用程序重建表单主体。任何在过滤器链运行之前读取请求参数的Servlet过滤器都需要在FormFilter之前排序。请参见以下示例。
import jakarta.servlet.Filter;
import org.springframework.cloud.gateway.server.mvc.filter.FormFilter;
import org.springframework.core.Ordered;
class MyFilter implements Filter, Ordered {
@Override
public int getOrder() {
return FormFilter.FORM_FILTER_ORDER - 1;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
// ...
filterChain.doFilter(request, response);
// ...
}
}