• 清除@SessionAttributes 网站实现退出登录


    在网站实现登录时,我认识了@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的数据

  • 相关阅读:
    JavaScript的continue、break和return的区别
    JavaScript的函数和作用域闭包
    利用反射快速给Model实体赋值
    C# 多态的实现
    C# 去除字符串首尾字符或字符串
    C#中大List的内存分配
    C#实现对图片文件的压缩、裁剪操作实例
    StringBuilder String string.Concat 字符串拼接速度
    C# 事件浅析
    理解 Thread.Sleep 函数
  • 原文地址:https://www.cnblogs.com/lwx521/p/8681822.html
Copyright © 2020-2023  润新知