Spring boot中使用@SessionAttributes需要注意的地方

在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有值,那么就跳过绑定数据的方法,然后绑定请求数据

猜你喜欢

转载自weiqingfei.iteye.com/blog/2370635