SpringMVC如何实现Post方式重定向的两种方法

清欢
清欢
发布时间:2026-10-16 | 5人浏览过
原创

在Spring MVC项目中,若需要在执行完业务逻辑后以POST方式跳转到另一页面(而非默认的GET重定向),可通过 RedirectView 设置POST标记来实现,也可以通过输出带有自动提交的HTML Form表单来完成。后者在处理复杂参数传递时更为灵活。

为什么不能直接用 POST 重定向?

在标准的 HTTP 协议和 Servlet 规范中,response.sendRedirect()(即 GET 重定向)会向浏览器发送一个状态码(如 302/301)及新 URL。浏览器接收到该响应后,默认会使用 GET 方法再次请求新的地址。虽然 HTTP 规范在某些情况下允许通过 POST 进行重定向(如 RFC 7231 定义的 307 Temporary Redirect),但主流框架和浏览器对这类支持的兼容性并不一致,因此 Spring MVC 默认的 return "redirect:/..." 语法始终使用 GET 请求。

方法一:使用 RedirectView 强制提交 POST

RedirectView 是 Spring MVC 提供的专门用于处理重定向视图的类。它支持配置是否以 POST 方式发送请求。这种方式适合不需要传递大量表单数据、只需改变 URL 的状态的场景。

@RequestMapping(value = "postPayAmount", method = RequestMethod.GET) 
public RedirectView postPayAmount(HttpSession session, ModelMap map) {
    // URI_PAY 为目标路径
    // true -> http://xxx.com/path 
    // false, false, false -> contextRelative=false, cacheable=false, targetUrlEncoded=false
    // 最后一个参数为false代表以post方式提交请求(注:根据具体版本和源码,这里通常涉及 setHttpMethod)
    return new RedirectView("/target/url", true, false, false);
}

注意:在不同版本的 Spring Framework 中,RedirectView 构造函数或 setter 方法的签名可能有所差异。如果需要明确指定 POST,确保调用了 setHttpMethod(RedirectView.POST)。

方法二:通过 HTML 表单自动提交(最稳健)

如果需要保留 POST 请求中的表单数据(例如支付回调、复杂的参数映射),最通用的做法是利用浏览器特性:返回一段包含 <form> 标签的 HTML 代码,并通过 JavaScript 立即触发提交。这种方法兼容所有 HTTP 客户端。

第一步:封装通用工具类

创建一个静态方法,接收响应对象、目标 URL 和要传递的参数 Map,动态生成表单并注入到页面中。

/**
 * @Description: 后台进行POST请求 (请在代码执行结尾调用)
 */
public static void doBgPostReq(HttpServletResponse response, String postUrl, Map paramMap) throws IOException {
    response.setContentType("text/html;charset=utf-8"); 
    PrintWriter out = response.getWriter(); 
    
    // 开始构建表单
    out.println("<html><body>"); 
    out.println("<form name='postSubmit' method='post' action='" + postUrl + "' >"); 
    
    // 将参数转换为隐藏域
    for (String key : paramMap.keySet()) {
        Object value = paramMap.get(key); 
        if (value != null) {
             out.println("<input type='hidden' name='" + key + "' value='" + value.toString() + "'>"); 
        } 
    }
    
    out.println("</form>");   
    out.println("<script>");   
    out.println("  document.postSubmit.submit()");   
    out.println("</script>"); 
    out.println("</body></html>"); 
}

第二步:在 Controller 中调用

准备数据 Map,调用上述工具类输出 HTML。

@RequestMapping(value = "doPostRedirectView.do", method = RequestMethod.GET)
@ResponseBody // 避免解析模板引擎,直接输出文本
public void doPostRedirectView(HttpServletRequest request, HttpServletResponse response, ModelMap map) throws IOException {
    logger.debug("-----进入了doPostRedirectView----");
    
    // 准备要传递给下一页的参数
    Map<String, String> payParams = new HashMap<>(); 
    payParams.put("amount", "100"); 
    payParams.put("orderId", "123456"); 
    
    // 调用工具类进行 POST 转发
    HttpUtils.doBgPostReq(response, "/target/action.do", payParams);
}

常见问题排错:POST 提交出现 405 Method Not Allowed

如果在尝试通过其他方式模拟 POST 跳转时遇到 405 错误,通常是因为目标接口只允许了 GET,或者前端请求未正确匹配 Spring MVC 的路径映射。

  • 检查目标 Controller 注解: 确保目标接口使用了 @PostMapping 或 @RequestMapping(method = RequestMethod.POST)。
  • 检查表单 Action: 如果是 HTML 表单形式,确保 action 属性指向了正确的 URL 且拼写无误。
  • CSRF 验证: 如果项目开启了 Spring Security 或 CSRF 保护,普通的表单自动提交可能会因为缺少 Token 而失败,此时需在生成的表单中加入隐藏的 CSRF Token 字段。

总结

对于 Spring MVC 中的 POST 重定向需求:
1. 如果只是简单的页面跳转子路由且不带敏感大批量数据,可以使用 RedirectView。
2. 如果需要像用户点击按钮一样发起完整的 POST 请求(特别是需要传递参数时),推荐采用输出含 JS 自动提交的 HTML Form 的形式,这是兼容性最好、最符合 HTTP 语义的解决方案。

以上就是SpringMVC如何实现Post方式重定向的详细内容,更多关于SpringMVC的重定向技巧资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表