You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用http://localhost:7001/app到http://localhost:7001/app/的自动重定向?

解决POST请求到/app被自动重定向到/app/导致数据丢失的问题

问题根源

Servlet容器(如Tomcat)默认会对访问上下文根(/app)但URL末尾无斜杠的请求返回302重定向,指向带斜杠的路径(/app/),且重定向会将原POST请求转为GET,直接导致请求体内容丢失。

可行解决方案

1. 直接调整请求URL(最简单方案)

让发起请求的客户端直接使用带斜杠的路径:http://localhost:7001/app/,从根源避免触发容器的自动重定向逻辑。

2. 在过滤器中拦截并转发(无需修改容器配置)

在你的AllFilter中添加拦截逻辑,手动将无斜杠的POST请求转发到带斜杠的路径,保留POST方法和请求体:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    
    String requestURI = req.getRequestURI();
    String method = req.getMethod();
    
    // 匹配POST请求到/app(不带斜杠)的场景
    if ("POST".equalsIgnoreCase(method) && "/app".equals(requestURI)) {
        // 转发到带斜杠的路径,保留POST方法与请求体
        req.getRequestDispatcher("/app/").forward(req, resp);
        return;
    }
    
    chain.doFilter(request, response);
}

当前你的过滤器url-pattern="*"的配置已确保其优先于容器默认Servlet执行,能拦截到目标请求。

3. 修改Servlet容器配置(以Tomcat为例)

如果需要全局禁用这类重定向,可以修改Tomcat的全局配置:
打开conf/web.xml,找到DefaultServlet的配置块,添加初始化参数:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <!-- 保留原有参数 -->
    <init-param>
        <param-name>redirectWithPathInfo</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

该参数会关闭DefaultServlet自动重定向无斜杠目录请求的行为。

内容的提问来源于stack exchange,提问作者BlackZeroX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:33:10