spring boot之session的建立,銷燬,超時,監聽等等小結
阿新 • • 發佈:2019-01-03
一、 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的建立
其中HttpSession session=request.getSession(true); //true表示如果這個HTTP請求中,有session,那麼可以直接通過getSession獲取當前的session,如果當前的請求中沒有session,則會自動新建一個session HttpSession session=request.getSession(false);//false表示只能獲取當前請求中的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); }
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);
}
}