1. 程式人生 > >spring boot之session的建立,銷燬,超時,監聽等等小結

spring boot之session的建立,銷燬,超時,監聽等等小結

一、 session簡介

1. 伺服器可以為每個使用者瀏覽器建立一個會話物件(session物件),一個瀏覽器只能產生一個session,當新建一個視窗訪問伺服器時,還是原來的那個session。session中預設儲存的是當前使用者的資訊。因此,在需要儲存其他使用者資料時,我們可以自己給session新增屬性。session(會話)可以看為是一種標識,通過帶session的請求,可以讓伺服器知道是誰在請求資料。

二、 session與cookie的區別和聯絡

1、 session是由伺服器建立的,並儲存在伺服器上的。在session建立好之後,會把sessionId放在cookie中返回(response)給客戶端。返回的程式碼應該是這樣子的。返回的cookie是儲存在客戶端的。

 String sessionId = session.getId();
 Cookie cookie = new Cookie("JSESSIONID", sessionId);
 cookie.setPath(request.getContextPath());
 response.addCookie(cookie);
2、 以後的每次HTTP請求都會帶著sessionId,來跟蹤使用者的整個會話。

3、 session的過期和超時與cookie的過期沒有什麼聯絡,都是可以分別進行設定的。但是當session或cookie中任意一方過期,那麼使用者就需要重新登入了。

三、 session相關

1、 session的建立
@GetMapping("demo")
public void demo(HttpServletRequest request){
HttpSession sessoin=request.getSession();//這就是session的建立
session.setAttribute("username","TOM");//給session新增屬性屬性name: username,屬性 value:TOM
session.setAttribute("password","tommmm");//新增屬性 name: password; value: tommmm
System.out.println(session.geiId);
}
其中HttpSession session=request.getSession(true); //true表示如果這個HTTP請求中,有session,那麼可以直接通過getSession獲取當前的session,如果當前的請求中沒有session,則會自動新建一個session        HttpSession session=request.getSession(false);//false表示只能獲取當前請求中的session,如果沒有也不能自動建立。
2、 session的 獲取屬性
session.getAttribute("username");
session.getAttribute("password"); 
3、 session,cookies的超時設定  1 在.yml裡面或.xml配置檔案裡面

 2 在建立session時

 session.setMaxInactiveInterval(30*60);//以秒為單位,即在沒有活動30分鐘後,session將失效

四、 session的監聽

監聽session主要有三個介面,用這兩個就夠用了。

實現介面HttpSessionListener下的sessionCreated();//當session建立時。

和sessionDestroyed();//當session被銷燬或超時時。

實現介面HttpSessionAttributeListener下的 attributeAdded() //當給session新增屬性時

attributeRemoved();和attributeReplaced();

以下是簡單的實現了線上人數統計的功能。

如果要更深刻的瞭解session的工作機制,多執行幾次session的監聽程式碼(可以參考一下的程式碼)。

@WebListener
public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener{
 public static final Logger logger= LoggerFactory.getLogger(SessionListener.class);

    @Override
    public void  attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        logger.info("--attributeAdded--");
        HttpSession session=httpSessionBindingEvent.getSession();
        logger.info("key----:"+httpSessionBindingEvent.getName());
        logger.info("value---:"+httpSessionBindingEvent.getValue());

    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
logger.info("--attributeRemoved--");
}

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
logger.info("--attributeReplaced--");
    }

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        logger.info("---sessionCreated----");
        HttpSession session = event.getSession();
        ServletContext application = session.getServletContext();
        // 在application範圍由一個HashSet集儲存所有的session
        HashSet sessions = (HashSet) application.getAttribute("sessions");
        if (sessions == null) {
            sessions = new HashSet();
            application.setAttribute("sessions", sessions);
        }
        // 新建立的session均新增到HashSet集中
       sessions.add(session);
        // 可以在別處從application範圍中取出sessions集合
        // 然後使用sessions.size()獲取當前活動的session數,即為“線上人數”
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) throws ClassCastException {
        logger.info("---sessionDestroyed----");
        HttpSession session = event.getSession();
        logger.info("deletedSessionId: "+session.getId());
        System.out.println(session.getCreationTime());
        System.out.println(session.getLastAccessedTime());
        ServletContext application = session.getServletContext();
        HashSet sessions = (HashSet) application.getAttribute("sessions");
        // 銷燬的session均從HashSet集中移除
        sessions.remove(session);
    }

}