使用spring mvc进行Java web开发时,如果同时使用@SessionAttributes 和@ResponseBody注解,就会出现
“java.lang.IllegalStateException: Cannot create a session after the response has been committed ”这个错误。这是为什么呢,因为我们在创建session前,已经将response进行了提交。
下面通过一个例子进行说明:
@Controller
@RequestMapping("/")
@SessionAttributes(value = {"user"})
public class UserController {
@ResponseBody
@RequestMapping("add")
public String method1(ModelMap map) {
User user = new User();
map.addAttribute("user", user);
return "success";
}
@ResponseBody
@RequestMapping("update")
public String method2(ModelMap map ) {
System.out.println(map.get("user"));
return "success";
}
}
当访问method1时,就会报上面错误。原因是@SessionAttributes中定义了ModelMap中哪些属性将要存入session中。因为这个存入session的动作是在method1方法结束后发生的,而return 语句一结束,response就会立即被返回,因此就会造成
“Cannot not create session after response has been committed”。
解决方法:
在return之前,创建自己的session,即将上面的method1变成如下:
@ResponseBody
@RequestMapping("add")
public String method1(ModelMap map, HttpSession session) {
User user = new User();
map.addAttribute("user", user);
return "success";
}
这样就能保证在return之前,session已将被创建。
这是一种最传统的方式,虽然问题得以解决,但是可能不太符合spring mvc框架解耦的初心。
如果你们有更好的方法,欢迎在评论区交流。