初学springMVC一直觉得sessionAttributes注解很不错,不用自己手动set就可以自动往session里添加数据。于是想到了使用在用户登录上。当初的想法很简单,就是在用户登录的时候使用sessionAttributes注解往session中放入username,然后在注销的时候invalidate。配置了一个springmvc拦截器,判断登录信息,如果有就放行,没有就sendRedirect到login.jsp页面。这个做的很顺利,没有碰到什么很大的问题,没有登录的时候使用查询功能跳转到了login.jsp,登录后就可以查询出数据了。正在沾沾自喜准备完成最后注销功能的时候出问题了,can’t not create session on response completed!大致就是这个错误。这我就不明白,我什么时候去create session了?并且发现当我把invalidate改成remove后就不报错了,但logout后还是可以查询,我又不明白了!!!debug到interceptor中发现logout后session中的username还是有数据,神马情况?what happened…
    这下傻了,到这里相信一般的童鞋都会去问度娘之类吧,不好意思,查下来没有人使用sessionAttributes做用户登录,至于为什么没有,这个也查不到!好吧,不用了吧。不行,我那倔脾气啊,我不能退缩啊。那南墙到了怎么办呢?最后又把logout改为invalidate,终于在springmvc源码中找到了答案。原来标注了sessionAttributes注解后springmvc会调用ServletRequestAttributes的setAttribute方法执行session.setAttribute(name, value);所以当我使用session.invalidate()后当然会报can’t not create session了,改成removeAttribute后虽然不存在create session的问题但springmvc在执行中还是会调用session.setAttribute(name, value);所以,当我使用了sessionAttributes注解后即使我remove了后springmvc还会把它set进来,所以这个username的信息仍然会在session中。

    终于,问题解决了,也就是说,使用session.invalidate()方法的类上是不能标注sessionAttributes的。另外提一点,在标注sessionAttributes注解的类中一定要有modelAttribute,使之在sessionAttributes注解调用前执行,不然的话你就要使用其他方法在request域中放入username信息,比如