我有一个带@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";
}
}
答案 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客户端代码处理该响应并请求下一页。