Spring中@ModelAttribute以及超级坑爹的@SessionAttributes注解

Spring中@ModelAttribute以及超级坑爹的@SessionAttributes注解

重要的结论要先说出来,千万不要用@SessionAttributes来保存http session的属性!!!

在Spring MVC中,@ModelAttribute注解作用在方法或者方法参数上,表示将被注解的方法的返回值或者是被注解的参数作为Model的属性加入到Model中,然后Spring框架自会将这个Model传递给ViewResolver。Model的生命周期只有一个http请求的处理过程,请求处理完后,Model就销毁了。

@SessionAttributes(attrName)注解的意思就是将Model中的attrName属性作为session的属性保存下来。

但关键是它并不仅仅是将这个属性放到HttpSession中这么简单!它的做法大概可以理解为将Model中的被注解的attrName属性保存在一个SessionAttributesHandler中,在每个RequestMapping的方法执行后,这个SessionAttributesHandler都会将它自己管理的“属性”从Model中写入到真正的HttpSession;同样,在每个RequestMapping的方法执行前,SessionAttributesHandler会将HttpSession中的被@SessionAttributes注解的属性写入到新的Model中。注意!它的生命周期很别扭哦!

所以如果在方法中用HttpSession.removeAttribute()来删除被@SessionAttributes注解的属性,你会发现根本没有效果,因为方法执行结束后,它又被SessionAttributesHandler从Model中写回HttpSession了。可以用一个SessionStatus.setComplete()方法来让SessionAttributesHandler在方法结束后不接手工作,从而达到不写入HttpSession的目的,但这方法太鸡巴扯了我感觉。

所以,最重要的是,千万不要使用@SessionAttributes注解来管理session的属性!!!

下面贴一个简单的例子,自己试一下就知道了

重要的事情说第三遍!前往不要用@SessionAttributes注解!要自己手动来操作HttpSession!

发表评论

电子邮件地址不会被公开。 必填项已用*标注