在网站实现登录时,我认识了@SessionAttributes,对我来说是真的好用,@SessionAttributes注解可以使得模型中的数据存储一份到session域中。
这样在页面跳转时可以直接通过${sessionScope.xxx}获取用户名等信息,非常好用。
但是今天我做退出登录时发现一个问题,我在controller里清除了用户信息如下:
@RequestMapping("/outLogin") public String tologout(HttpSession session,HttpServletRequest request,HttpServletResponse response) { session.removeAttribute("user"); return "redirect:/login"; }
但是页面还是可以获取user,这让我很郁闷,无奈求助百度,看到了这篇博客https://blog.csdn.net/hayre/article/details/54666275,
原来
Spring mvc在调用处理方法前,在请求线程中自动一个隐含的模型对象,调用所有在方法级别标注了@ModelAttribute的方法,并将方法返回值添加到隐含模型中,
查看Session中是否存在@SessionAttributes(“xxx”)所指定的xxx属性,如果有,将其添加到隐含模型中,如果隐含模型已经存在xxx属性,该步骤会覆盖隐含模型中已有的属性值。 对应标注了@ModelAttribute(“xxx”)方法的入参按如下流程 如果隐含模型包含了xxx属性,将其赋给该入参,再用请求消息填充该入参对象直接返回,否则如果xxx是会话属性,即处理类定义出标注了@SessionAttributes(“xxx”),
则尝试从该会话中获取该属性,并将其值赋给入参,然后再用请求填充该入参对象,如会话中找不到xxx属性,则抛出HttpSessionRequiredException,
如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参的对象实例,在用请求填充该入参。 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如@SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。 @SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据
参考这篇博客我进行了修改
@RequestMapping("/outLogin") public String tologout(HttpSession session,HttpServletRequest request,HttpServletResponse response,SessionStatus sessionStatus) { session.removeAttribute("user"); sessionStatus.setComplete(); return "redirect:/login"; }
@SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。注意,session.removeAttribute只清除@SessionAttributes的session,不会清除HttpSession的数据