1. 程式人生 > >JavaWeb - 應用篇

JavaWeb - 應用篇

一、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、下載地址

點選進入下載頁面