巧用session機制實現使用者不重複登入、記錄使用者登入日誌、統計線上人數
阿新 • • 發佈:2019-01-02
- HttpSessionBindingListener
這個具體的使用文件自查,本篇中是新建了一個類實現本介面
public class UsersOnlineCountListener implements HttpSessionBindingListener {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@SuppressWarnings("unchecked")
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("賬號"+user.getAccount()+"的使用者登入了"+f.format(new Date()));
HttpSession session = arg0.getSession();
ServletContext application = session.getServletContext();
session.setAttribute("user" , user);
List<String> ucList = null;
// 第一次使用前,需要初始化
if (application.getAttribute("ucList") == null) {
ucList = new ArrayList<String>();
application.setAttribute("ucList", ucList);
}else {
ucList = (List<String>)application.getAttribute("ucList" );
}
ucList.add(user.getAccount());
System.out.println("當前登入人數:"+ucList.size());
}
@SuppressWarnings("unchecked")
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("賬號"+user.getAccount()+"的使用者退出了"+f.format(new Date()));
HttpSession session = arg0.getSession();
ServletContext application = session.getServletContext();
session.removeAttribute("user");
List<String> ucList = null;
// 第一次使用前,需要初始化
if (application.getAttribute("ucList") == null) {
ucList = new ArrayList<String>();
application.setAttribute("ucList", ucList);
}else {
ucList = (List<String>)application.getAttribute("ucList");
}
ucList.remove(user.getAccount());
System.out.println("當前登入人數:"+ucList.size());
}
}
User是傳值模型,UsersOnlineCountListener類實現了介面的兩個方法,一個是valueBound,一個是valueUnbound,從字面上理解,在監聽器與session進行繫結與解綁時呼叫。
- 使用舉例
UsersOnlineCountListener uocl = new UsersOnlineCountListener();
uocl.setUser(u);
this.getSession().setAttribute("uocl", uocl);
註冊一個監聽器,User注值,與session進行繫結,此時會呼叫監聽器的valueBound方法。
這段程式碼執行有幾個前提,一是使用者驗證通過,二是使用者列表為空或者暫無當前使用者,只有滿足這兩個條件方可算登入成功。
List<String> ucList = null;
if(this.getSession().getServletContext().getAttribute("ucList")!=null) {
ucList = (List<String>)this.getSession().getServletContext().getAttribute("ucList");
}
if(ucList == null || !ucList.contains(u.getAccount())) {
// 上一段程式碼塊
}else{
// 使用者已登入
}