Java web工程判斷用戶是否重複登錄

前幾天,網上找了些朋友的資料,做了一個小功能,驗證用戶是否重複登錄。

原理就是:每一個用戶,登錄前有一個驗證,當第一次登錄時,會把其session信息,添加到一個特定的靜態變量中。當第二次登錄時,驗證到靜態變量中存在該用戶的信息,就表示爲重複登錄。

jsp代碼,一個form表單提交:

<form action="/struts2upload/system/login/reLogin.action"
			method="post">
			用戶名:
			<input type="text" id="txtUser" name="txtUser" value="" />
			密  碼:
			<input type="text" id="txtPass" name="txtPass" value="" />
			<input type="submit" id="subOk" value="確定" />
		</form>
struts2配置:

<action name="reLogin" class="userLoginAction" method="reLogin">
			<result name="input" type="redirect">/relogin.jsp</result>
			<result name="success" type="redirect">/ok.jsp</result>
		</action>
action代碼:

/*
	 * 可判斷用戶是否重複登錄
	 */
	public String reLogin() {
		String userId = this.getTxtUser();//ServletActionContext.getRequest().getParameter("txtUser");
		UserInfo user = new UserInfo();
		user.setUserId(userId);
		//驗證該用戶ID,是否已經登錄。當前用戶比較已登錄到系統的靜態變量中的值,是否存在。
		Boolean hasLogin = SessionUserListener.checkIfHasLogin(user);
		// 如果重複登錄,控制端則打印信息,返回登錄頁面
		if (hasLogin) {
			System.out.println(user.getUserId()+"已經登錄到本系統。");
			return "input";
			// SessionUserListener.removeUserSession(userId);
		} else {
			// 如果沒有重複登錄,則將該登錄的用戶信息添加入session中
			ServletActionContext.getRequest().getSession().setAttribute("userInfo", user);
			// 比較保存所有用戶session的靜態變量中,是否含有當前session的鍵值映射,如果含有就刪除
			if (SessionUserListener.containsKey(ServletActionContext.getRequest().getSession().getId())) {
				SessionUserListener.removeSession(ServletActionContext.getRequest().getSession().getId());
			}
			//把當前用戶封裝的session按,sessionID和session進行鍵值封裝,添加到靜態變量map中。
			SessionUserListener.addUserSession(ServletActionContext.getRequest().getSession());
		}
		return "success";
	}
session監聽類:

package com.zyujie.listener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.zyujie.pojo.UserInfo;

public class SessionUserListener implements HttpSessionListener {

	// key爲sessionId,value爲HttpSession,使用static,定義靜態變量,使之程序運行時,一直存在內存中。
	private static java.util.Map<String, HttpSession> sessionMap = new java.util.concurrent.ConcurrentHashMap<String, HttpSession>(500);

	/**
	 * HttpSessionListener中的方法,在創建session
	 */
	public void sessionCreated(HttpSessionEvent event) {
		// TODO Auto-generated method stub
	}

	/**
	 * HttpSessionListener中的方法,回收session時,刪除sessionMap中對應的session
	 */
	public void sessionDestroyed(HttpSessionEvent event) {
		getSessionMap().remove(event.getSession().getId());
	}

	/**
	 * 得到在線用戶會話集合
	 */
	public static List<HttpSession> getUserSessions() {
		List<HttpSession> list = new ArrayList<HttpSession>();
		Iterator<String> iterator = getSessionMapKeySetIt();
		while (iterator.hasNext()) {
			String key = iterator.next();
			HttpSession session = getSessionMap().get(key);
			list.add(session);
		}
		return list;
	}

	/**
	 * 得到用戶對應會話map,key爲用戶ID,value爲會話ID
	 */
	public static Map<String, String> getUserSessionMap() {
		Map<String, String> map = new HashMap<String, String>();
		Iterator<String> iter = getSessionMapKeySetIt();
		while (iter.hasNext()) {
			String sessionId = iter.next();
			HttpSession session = getSessionMap().get(sessionId);
			UserInfo user = (UserInfo) session.getAttribute("userInfo");
			if (user != null) {
				map.put(user.getUserId(), sessionId);
			}
		}
		return map;
	}

	/**
	 * 移除用戶Session
	 */
	public synchronized static void removeUserSession(String userId) {
		Map<String, String> userSessionMap = getUserSessionMap();
		if (userSessionMap.containsKey(userId)) {
			String sessionId = userSessionMap.get(userId);
			getSessionMap().get(sessionId).invalidate();
			getSessionMap().remove(sessionId);
		}
	}

	/**
	 * 增加用戶到session集合中
	 */
	public static void addUserSession(HttpSession session) {
		getSessionMap().put(session.getId(), session);
	}

	/**
	 * 移除一個session
	 */
	public static void removeSession(String sessionID) {
		getSessionMap().remove(sessionID);
	}

	public static boolean containsKey(String key) {
		return getSessionMap().containsKey(key);
	}

	/**
	 * 判斷該用戶是否已重複登錄,使用
	 * 同步方法,只允許一個線程進入,纔好驗證是否重複登錄
	 * @param user
	 * @return
	 */
	public synchronized static boolean checkIfHasLogin(UserInfo user) {
		Iterator<String> iter = getSessionMapKeySetIt();
		while (iter.hasNext()) {
			String sessionId = iter.next();
			HttpSession session = getSessionMap().get(sessionId);
			UserInfo sessionuser = (UserInfo) session.getAttribute("userInfo");
			if (sessionuser != null) {
				if (sessionuser.getUserId().equals(user.getUserId())){
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 獲取在線的sessionMap
	 */
	public static Map<String, HttpSession> getSessionMap() {
		return sessionMap;
	}

	/**
	 * 獲取在線sessionMap中的SessionId
	 */
	public static Iterator<String> getSessionMapKeySetIt() {
		return getSessionMap().keySet().iterator();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章