java.lang.IllegalStateException: Cannot create a session after the response has been committed

使用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框架解耦的初心。

如果你们有更好的方法,欢迎在评论区交流。

你可能感兴趣的:(java,web)