JavaWeb - 應用篇
阿新 • • 發佈:2018-11-10
一、Web實現登入註冊功能
1、效果圖
2、結構圖
3、關鍵詞
- Cookie
- UploadFile(位元組流操作)
- InitServlet(自啟動)(<load-on-startup>)
- multipart/form-data + post 獲取步驟
- UUID
4、下載地址
二、Web實現唯一登入功能(過濾器 + 監聽器 + 單例模式)
1、專案分析圖
Ps:必須使用兩個不同的瀏覽器,否則session是一樣的,檢測不出效果。
2、核心程式碼
package com.imooc.listener; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import com.imooc.cache.LoginCache; /** * 使用者登入監聽器 * @author lv * */ public class LoginSessionListener implements HttpSessionAttributeListener { private static final String LOGIN_USER="loginUser"; @Override public void attributeAdded(HttpSessionBindingEvent hsbe) { String attrName = hsbe.getName();//監聽到session屬性值發生新增操作,獲取對應操作的屬性名 if(LOGIN_USER.equals(attrName)){//若屬性名為登入屬性名,判定為使用者登入操作 String attrVal = (String)hsbe.getValue();//獲取新增的屬性值,即使用者登入名 HttpSession session = hsbe.getSession();//該次操作的session物件 String sessionId = session.getId();//該次操作的session物件ID String sessionId2 = LoginCache.getInstance().getSessionIdByUsername(attrVal);//從快取物件裡面,獲得該使用者登入名對應的sessionID值 if(null == sessionId2){//未獲得結果,不需要清理前次登入使用者會話資訊 }else{ HttpSession session2 = LoginCache.getInstance().getSessionBySessionId(sessionId2);//獲取前次該使用者登入對應的session物件 session2.invalidate();//清理前次登入使用者會話儲存資訊,使得前次登入失效 } //完成該次登入使用者登入名、sessionID,session物件的快取物件儲存 LoginCache.getInstance().setSessionIdByUserName(attrVal, sessionId); LoginCache.getInstance().setSessionBySessionId(sessionId, session); } } @Override public void attributeRemoved(HttpSessionBindingEvent arg0) { } @Override public void attributeReplaced(HttpSessionBindingEvent arg0) { } }
Ps:使用sessionAttr監聽器而不是用session監聽器,因為只是建立session監聽是毫無意義的,比如:進入到登入頁面,但可能沒有登入,但是監聽功能已經啟動了。
package com.imooc.cache; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; /** * 登入使用者與session快取物件 * @author lv * */ public class LoginCache { private static LoginCache instance = new LoginCache(); private Map<String,String> loginUserSession = new HashMap<String,String>();// key值:登入使用者登入名,value值:登入使用者sessionId private Map<String,HttpSession> loginSession = new HashMap<String,HttpSession>();//key值:登入使用者sessionId,value值:登入使用者session物件 private LoginCache(){ } public static LoginCache getInstance(){ return instance; } /** * 通過登入名獲取對應登入使用者的sessionId * @param username * @return */ public String getSessionIdByUsername(String username){ return loginUserSession.get(username); } /** * 通過sessionId獲取對應的session物件 * @param sessionId * @return */ public HttpSession getSessionBySessionId(String sessionId){ return loginSession.get(sessionId); } /** * 儲存登入名與對應的登入sessionID至快取物件 * @param username * @param sessionId */ public void setSessionIdByUserName(String username,String sessionId){ loginUserSession.put(username, sessionId); } /** * 儲存sessionId與對應的session物件至快取物件 * @param sessionId * @param session */ public void setSessionBySessionId(String sessionId,HttpSession session){ loginSession.put(sessionId, session); } }
3、下載地址