如何禁用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
相关产品推荐
相关产品推荐

