如何从弹簧ajax控制器重定向?

时间:2016-08-08 07:16:21

标签: spring spring-mvc

我有一个带@ResponseBody注释的控制器。我想要做的是如果该用户不存在处理用户的Id并返回一个json对象。如果存在,则使用userInfo重定向到用户页面。下面的代码给出了ajax错误。有没有办法用userInfo重定向到用户页面?

    @RequestMapping(value = "/user/userInfo", method = {RequestMethod.GET})
    @ResponseBody
    public String getUserInfo(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {

       if(...){
          .....//ajax return
       }else{
          modelMap.addAttribute("userInfo", userInfoFromDB);
          return "user/user.jsp";
       }

    }

1 个答案:

答案 0 :(得分:2)

嗯,这个方法用@ResponseBody注释。这意味着String返回值将是响应的主体。所以,您只需将"user/user.jsp"返回给来电者。

由于您拥有对响应的完全访问权限,因此您始终可以明确地使用response.sendRedirect(...);进行重定向。甚至可以明确地要求Spring通过 flash userInfoFromDB作为RedirectAttribute传递。您可以在我this other answer中看到更多详细信息(后者用于拦截器,但可以在控制器中使用相同的内容)。您必须返回null告诉spring控制器代码已完全处理了响应。这将是:

...
}else{
    Map<String, Object> flash = RequestContextUtils.getOutputFlashMap(request);
    flash.put("userInfo", userInfoFromDB);
    response.redirect(request.getContextPath() + "/user/user.jsp");
    return null;
}
...

问题是客户端期望一个不会到达的字符串响应,必须准备好。如果不是,您将得到客户端错误。然后替代方案不是重定向,而是传递包含下一个URL的特殊字符串:

...
}else{
    Map<String, Object> flash = RequestContextUtils.getOutputFlashMap(request);
    flash.put("userInfo", userInfoFromDB); // prepare the redirect attribute
    return "SPECIAL_STRING_FOR_REDIRECT:" + request.getContextPath() + "/user/user.jsp");
}

让javascript客户端代码处理该响应并请求下一页。