POST 上的 Spring 重定向

Posted

技术标签:

【中文标题】POST 上的 Spring 重定向【英文标题】:Spring redirect on POST 【发布时间】:2017-03-30 14:14:33 【问题描述】:

这是我的更新用户方法:

@ResponseBody
@Transactional
@RequestMapping(value = "/profile/edit/id", method = RequestMethod.POST)
public String updateUser(@PathVariable("id") final Integer id, String firstname, String lastname, final RedirectAttributes redirectAttributes) 

    respository.updateFirstname(id,firstname);
    respository.updateLastname(id, lastname);

    redirectAttributes.addFlashAttribute("message", "Successfully changed..");
    return "redirect:/profile";

一切正常。还有数据库中的更新。但重定向只是一个字符串,不要更改路径。谁能告诉我为什么?

【问题讨论】:

删除@ResponseBody。让你的控制器事务性也是一个糟糕的主意......你应该有一个事务性边界的服务(这样你就可以重用这些东西)。 【参考方案1】:

@ResponseBody 仍然可以进行重定向。

您可以通过以下方式执行此操作,这样您仍然可以在 @ResponseBody(例如 json)中传递预期数据,并且如果某些“用例”迫使您进行重定向。同样按照建议,不要在控制器级别使用事务范围,而是在服务层上使用

@ResponseBody
@RequestMapping(value = "/profile/edit/id", method = RequestMethod.POST)
public String updateUser(@PathVariable("id") final Integer id, String firstname, String lastname, final RedirectAttributes redirectAttributes, HttpServletResponse response) 

    respository.updateFirstname(id,firstname);
    respository.updateLastname(id, lastname);

    if(someCondition == "redirectMe")
       redirectAttributes.addFlashAttribute("message", "Successfully changed..");
       response.sendRedirect("/profile");
    

 return "some_data_for_view";

【讨论】:

【参考方案2】:
@GetMapping("/abc/def")
public void some_method(HttpServletResponse response)
//to do
response.sendRedirect("url");

【讨论】:

【参考方案3】:

问题出在@ResponseBody 注释中。删除后,重定向应按预期工作。通过使用它,您可以覆盖 Spring MVC 的默认行为,并将返回值视为原始响应。

【讨论】:

以上是关于POST 上的 Spring 重定向的主要内容,如果未能解决你的问题,请参考以下文章

spring重定向设置请求头header

Spring之跨重定向请求传递数据

spring mvc 重定向,地址栏带了参数,不想带怎么办

Apache 上的重定向(维护 POST 参数)

在 spring 控制器的重定向中将请求方法从 POST 更改为 GET

spring mvc怎么重定向