Spring boot中使用@SessionAttributes需要注意的地方 博客分类: Java SpringSpring bootSessionAttributes
程序员文章站
2024-03-21 15:10:52
...
在Spring Boot中,如果想把数据保存在session里,当然可以使用原生Request直接保存session,有个更方便的方法,那就是使用注解@SessionAttributes。
使用这个注解,需要搞清楚它的运行原理,也就是什么时候保存,什么时候取出,否则当得出非期望的结果时会很疑惑。
尤其当和注解@ModelAttribute混用的时候,需要搞清楚优先级。
1.Session的保存。
当某个Controller类里使用了@SessionAttributes注解后,请求执行完handler后,会把保存在model里指定的数据保存到session里。
由于执行时机的问题,当跟注解@ResponseBody混用的时候,会出错。
使用@ResponseBody注解,返回一个实体类时,ReturnValueHandler用的是RequestResponseBodyMethodProcessor,在内部直接会把结果写入到response,然后关闭。
然后再往session里写数据的话,就已经写不进去了。
解决的方法是不用注解@ResponseBody,直接返回一个MappingJackson2JsonView实例即可。
2.Session的读取
如果一个Controller类里同时使用了@SessionAttributes,有个数据绑定的方法上用@ModelAttribute,并且在一个请求处理handler的参数里,用了@ModelAttribute。
先读取session,如果session没值,那么就执行绑定数据的方法,然后绑定请求数据
先读取session,如果session有值,那么就跳过绑定数据的方法,然后绑定请求数据