解決單點登入的一個方法!

學無止境-逆流而上發表於2012-09-24
這個只需要session和application就好了,
使用者登入時,這樣寫:

User user = dao.login(userName, password);// 資料庫中判斷使用者名稱和密碼
if (null != user) {// 表示使用者存在
  session.setAttribute("user", user);// 把使用者放進session中
  application.setAttribute(userName, session.getId());/* 把使用者所在的sessionId放進application中,首先要明白一點,一個session對應一個瀏覽器,其次要注意一點,userName必須是唯一的*/
}



當使用者訪問到其他url的時候,可以在過濾器或你的攔截器中這樣寫:

User user = (User) session.getAttribute("user");// 從session中取出使用者
if (null == user) {// 未登入或者登入已經過期
  response.sendRedirect(request.getContextPath());// 跳轉到首頁或登入頁面
}
String sessionId = (String) application.getAttribute(user.getUserName());
if (null == sessionId || !sessionId.equals(session.getId())) {/*這說明使用者已經在其他電腦或其它瀏覽器登入了,那麼之前登入的session就無效了,自動被後面的登入給踢掉*/  
  response.sendRedirect(request.getContextPath());// 跳轉到首頁或登入頁面
}
chain.doFilter(request, response);// 通過驗證,放行使用者進入目標url


這種方式是我的一個前輩想到的,我們公司的所有專案都採納了這種方式,
確保一個賬號只能在一個瀏覽器中使用

相關文章