1. 程式人生 > >巧用session機制實現使用者不重複登入、記錄使用者登入日誌、統計線上人數

巧用session機制實現使用者不重複登入、記錄使用者登入日誌、統計線上人數

  • 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{
// 使用者已登入
}