2013-12-16 127 views
1

我有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

+0

它看起来像我预期的行为。什么是错的? – axtavt

回答

2

阅读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

+0

@Spring您不能继续请求参数。他们只在一次请求期间生活。你会想看看闪光灯的属性。在你的情况下,你发送了POST并收到了包含'Location'头的REDIRECT响应,你只是没有在该位置URI上完成GET。 –

+0

感谢您回复。在我的实际工作代码中,我确实需要将参数传递给POST,并将重定向到的URL携带请求参数。在这种情况下,为了确保GET-> POST-> Redirect-> GET正常工作,我修剪了这一切。我将postxxx更改为postForObject并具有相同的结果。由于在这个用例中,我没有传递任何参数,我想到任何触发'pr1()'的RestTemplate的postxxx方法都足够好了。它看起来像'pr1()'被调用。我在想'sendRedirect()'返回一个302,导致浏览器 – spring5150

+0

...在位置'/ provider/rd1'上执行GET。我如何获得调用'rd1()'的请求,发送?谢谢 – spring5150

0

你为什么不只是做:

@RequestMapping(value="/provider/pr1", method=RequestMethod.POST) 
public String pr1() { 
    logger.debug("In pr1. sending redirect to rd1"); 
    return "redirect:/provider/rd1"; 

} 
+0

该代码等同于OP的代码。 –

+0

我很抱歉,但什么是“OP的” –

+0

开幕式或原始帖子(er)。 –