假设我有一个用于编辑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)
当然,一个选项是在新窗口中打开编辑表单,因此用户所要做的就是关闭它并且它们回到原来的位置.
在我当前的应用程序中有一些地方我需要做一些复杂的事情,然后将用户传递给表单,然后让它们返回到起点.在这些情况下,我将起始点存储在会话中,然后再将它们关闭.对你正在做的事情来说,这可能有些过分.
其他选项:1)您可以存储"Referer"标题并使用它,但这可能不可靠; 并非所有浏览器都设置该标头.2)在表单提交后调用" history.go(-2)
" ,您可以在确认页面上使用javascript .
我的答案与 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