1. 程式人生 > >清除@SessionAttributes 網站實現退出登錄

清除@SessionAttributes 網站實現退出登錄

步驟 req attribute 但是 用戶名 查看 sta rec type

在網站實現登錄時,我認識了@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的數據

清除@SessionAttributes 網站實現退出登錄