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

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

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值