sendRedirect不按预期工作
我有2个控制器涉及相当简单的流程。其中一个进行一些处理,然后向另一个处理,然后重定向到呈现的页面。重定向失败,但没有错误。为了简化我的使用情况,并找出问题,我都倒了下来,以这3种方法 -sendRedirect不按预期工作
@RequestMapping(value="/provider/g1", method=RequestMethod.GET)
public void g1(HttpServletRequest request, HttpServletResponse response) {
logger.debug("In g1. posting to pr1");
try {
URI location = restTemplate.postForLocation("http://localhost:8082/provider/pr1", null);
logger.debug("post response=" + location.toString());
} catch (RestClientException re) {
logger.error("Unable to post to pr1.");
}
}
@RequestMapping(value="/provider/pr1", method=RequestMethod.POST)
public void pr1(HttpServletRequest request, HttpServletResponse response) {
logger.debug("In pr1. sending redirect to rd1");
// return "redirect:/provider/rd1";
try {
String rd1Path = "http://localhost:8082/provider/rd1";
response.sendRedirect(response.encodeRedirectURL(rd1Path));
} catch (IOException e) {
logger.error("Error redirecting to rd1");
e.printStackTrace();
}
}
@RequestMapping(value="/provider/rd1", method=RequestMethod.GET)
public void rd1(HttpServletRequest request, HttpServletResponse response) {
logger.debug("In rd1");
}
我曾经尝试都相对路径和完全合格的路径和它相同的结果。
- 我可以访问/ provider/rd1并获得预期的响应。
- 当我访问/ provider/g1时,我期待重定向到/ provider/rd1。
输出是 -
In g1. posting to pr1.
In pr1. sending redirect to rd1
post response=http://localhost:8082/provider/rd1
我想知道我做错了,我怎样才能使这项工作。
谢谢
SR
阅读javadoc of RestTemplate#postForLocation(..)
。它声明
通过将给定对象POST到URI模板 并创建一个新资源并返回Location标头的值。
请记住,POST-REDIRECT-GET是Web应用程序中非常常见的模式。
因此,您向http://localhost:8082/provider/pr1
发送HTTP POST请求,该请求返回302响应,并将Location
标题设置为http://localhost:8082/provider/rd1
,这是打印的内容。
您的rd1
永远不会被调用,因为永远不会发送匹配其映射的请求。
您可能正在寻找其他postXxx
方法RestTemplate
。
@Spring您不能继续请求参数。他们只在一次请求期间生活。你会想看看闪光灯的属性。在你的情况下,你发送了POST并收到了包含'Location'头的REDIRECT响应,你只是没有在该位置URI上完成GET。 –
感谢您回复。在我的实际工作代码中,我确实需要将参数传递给POST,并将重定向到的URL携带请求参数。在这种情况下,为了确保GET-> POST-> Redirect-> GET正常工作,我修剪了这一切。我将postxxx更改为postForObject并具有相同的结果。由于在这个用例中,我没有传递任何参数,我想到任何触发'pr1()'的RestTemplate的postxxx方法都足够好了。它看起来像'pr1()'被调用。我在想'sendRedirect()'返回一个302,导致浏览器 – spring5150
...在位置'/ provider/rd1'上执行GET。我如何获得调用'rd1()'的请求,发送?谢谢 – spring5150
你为什么不只是做:
@RequestMapping(value="/provider/pr1", method=RequestMethod.POST)
public String pr1() {
logger.debug("In pr1. sending redirect to rd1");
return "redirect:/provider/rd1";
}
该代码等同于OP的代码。 –
我很抱歉,但什么是“OP的” –
开幕式或原始帖子(er)。 –
它看起来像我预期的行为。什么是错的? – axtavt