使用 Servlets 和 Servlet 過濾器

Spring Cloud Gateway Server MVC 是為基於 Servlet API 並部署到 Servlet 容器的 Servlet 堆疊 Web 應用程式所建置的。如果您的應用程式使用 Servlets 或 Servlet 過濾器,您可能需要注意它們的排序。

由於 Servlet 容器處理請求參數的方式,當 Spring WebMVC 應用程式收到 application/x-www-form-urlencoded 的內容類型時,Servlet 容器會將這些參數與查詢參數組合到「請求」參數中。 Spring Cloud Gateway Server MVC 中包含一個特殊的 FormFilter bean,用於為下游應用程式重建表單 body。在過濾器鏈執行之前讀取請求參數的任何 Servlet 過濾器都需要在 FormFilter 之前排序。 請參見以下範例。

MyFilter.java
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);
        // ...
    }
}