Spring-MVC控制器重定向到"上一页"?

Bod*_*den 22 java spring-mvc

假设我有一个用于编辑Pony属性的表单,在我的Web应用程序中,有多个地方可以选择编辑Pony.例如,在Ponies列表中,每个Pony旁边可能有一个"编辑"链接,当用户正在查看Pony时,该视图中可能还有一个"编辑"链接.

当用户在编辑Pony后单击"提交"时,我想将用户返回到他或她在单击"编辑"链接时所在的页面.

如何编写控制器以将用户重定向回到他们开始的位置?当然我可以通过将参数传递给控制器​​来做到这一点,但这看起来有点傻.我是在考虑这一切都是错的,还是我要做的事情呢?

小智 51

这是如何做到男孩(注意这是RESTful Spring 3 MVC语法,但它将在较旧的Spring控制器中工作):

@RequestMapping(value = "/rate", method = RequestMethod.POST)
public String rateHandler(HttpServletRequest request) {
    //your controller code
    String referer = request.getHeader("Referer");
    return "redirect:"+ referer;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在编辑小马时出现验证错误并且用户返回到编辑小马页面,则无效.因为现在引用者将指向编辑小马页面. (8认同)
  • 绝对酷,但可能不可靠:http://en.wikipedia.org/wiki/HTTP_referrer#Referrer_hiding (3认同)

Jac*_*son 6

当然,一个选项是在新窗口中打开编辑表单,因此用户所要做的就是关闭它并且它们回到原来的位置.

在我当前的应用程序中有一些地方我需要做一些复杂的事情,然后将用户传递给表单,然后让它们返回到起点.在这些情况下,我将起始点存储在会话中,然后再将它们关闭.对你正在做的事情来说,这可能有些过分.

其他选项:1)您可以存储"Referer"标题并使用它,但这可能不可靠; 并非所有浏览器都设置该标头.2)在表单提交后调用" history.go(-2)" ,您可以在确认页面上使用javascript .


Eli*_*iuX 5

我的答案与 Sam Brodkins\xc2\xb4s 类似(我也推荐它)。但考虑到“Referer”值可能不可用,我创建了此函数以在我的控制器中使用它

\n\n
/**\n* Returns the viewName to return for coming back to the sender url\n*\n* @param request Instance of {@link HttpServletRequest} or use an injected instance\n* @return Optional with the view name. Recomended to use an alternativa url with\n* {@link Optional#orElse(java.lang.Object)}\n*/\nprotected Optional<String> getPreviousPageByRequest(HttpServletRequest request)\n{\n   return Optional.ofNullable(request.getHeader("Referer")).map(requestUrl -> "redirect:" + requestUrl);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在控制器调用函数中,您应该返回如下内容:

\n\n
@RequestMapping(value = "/upload", method = RequestMethod.POST)\npublic @ResponseBody\nString testRedirection(HttpServletRequest request)\n{\n      //Logic....\n      //Returns to the sender url\n      return getPreviousPageByRequest(request).orElse("/"); //else go to home page\n}\n
Run Code Online (Sandbox Code Playgroud)\n