Spring MVC重定向后无法加载视图问题求助
从你的描述和代码来看,核心问题出在AJAX请求的重定向处理逻辑上,我来一步步拆解:
为什么会出现这个现象?
你是通过发送带JSON请求体的POST请求调用/register接口——这本质是AJAX请求,而非普通的表单提交。当服务器返回redirect:login时,这个重定向指令是发给AJAX请求本身的,AJAX会自动去请求/login(所以你能看到控制台打印"Login page"),但它不会主动通知浏览器进行页面跳转,因此浏览器停留在原来的页面,不会加载login.jsp。
而直接访问localhost:8080/login是普通的HTTP GET请求,服务器返回视图解析后的login.jsp,浏览器自然能正常渲染。
解决方案
方案1:让前端处理跳转(推荐,符合前后端分离思路)
修改register方法的返回值,不再返回重定向,而是返回一个包含跳转指令的JSON响应,让前端JS负责页面跳转:
@RequestMapping(value = "/register", method = RequestMethod.POST, consumes = "application/json; charset=UTF-8") @ResponseBody public Map<String, String> register(@RequestBody Customer customer) { registrationService.registerCustomer(customer); Map<String, String> response = new HashMap<>(); response.put("redirect", "/login"); return response; }
然后在前端AJAX请求的成功回调里,处理跳转:
// 假设你用jQuery发送AJAX $.ajax({ url: "/register", type: "POST", contentType: "application/json", data: JSON.stringify(yourCustomerData), success: function(data) { if (data.redirect) { window.location.href = data.redirect; } } });
方案2:如果是普通表单提交,修正重定向路径
如果你其实是想用普通表单提交(不是AJAX),那要检查重定向的路径写法:把return "redirect:login"改成return "redirect:/login"——用绝对路径避免相对路径带来的解析问题:
@RequestMapping(value = "/register", method = RequestMethod.POST, consumes = "application/json; charset=UTF-8") public String register(@RequestBody Customer customer) { registrationService.registerCustomer(customer); // 用绝对路径重定向 return "redirect:/login"; }
另外,普通表单提交的话,consumes = "application/json; charset=UTF-8"可能不太合适,因为表单默认的Content-Type是application/x-www-form-urlencoded,如果是这种情况,你可能需要调整@RequestBody为@ModelAttribute或者去掉consumes属性。
为什么返回ModelAndView("login")也没用?
因为同样的道理,AJAX请求接收了ModelAndView解析后的login.jsp内容,但不会主动替换当前浏览器页面,只是把内容存在AJAX的响应里,所以你看不到页面变化。
内容的提问来源于stack exchange,提问作者Kacper Leśniak

