SpringMVC如何实现Post方式重定向的两种方法
在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, MapparamMap) 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 语义的解决方案。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













