Javawebではリスナーの操作を実現し、重複ログインの検証を行う


その前に、重複登録がどのように判断されているかを知る必要があります:1.ユーザがログインを行う場合、情報はセッションに存在して情報の伝達を行う.2.セッション転送中にH t t p S e ssionAttributeListenerのaddを使用してリスニング操作が可能であることが分かる.セッションはサーバ上に存在するクライアントではない.ログインブラウザのたびに、識別識別のために対応するsessionIdが生成され、コンテンツは接続されています.
では、私たちは1つの操作を行うことができます.sessionはサービス側が存在しているので、sessionに対する操作を行うことができます.そうすれば、すべての内容を実現することができます.
コンテンツをインスタンス化してデータの格納を行い、セッションの操作を行う
package cn.java.Cache;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

/*
 *            ,       ;
 *             ,instance;
 *            sessionId,     ;
 *       sessionId session   ;
 */
public class LoginCache {
	//       instance  ;intance         
	private static LoginCache instance = new LoginCache();
	//  MAP         sessionId
	private Map<String, String> loginUserSession = new HashMap<String, String>();
	//     session
	private Map<String,HttpSession> loginSession = new HashMap<String, HttpSession>();
	private LoginCache() {
		
	}
	//    ,         ,              
	public static LoginCache getInstance() {
		return instance;
	}
	//     
	public String getSessionIdByUserName(String username)
	{
		//               
		return loginUserSession.get(username);
	}
	public HttpSession getSessionBySessionId(String sessionId)
	{
		//   map           
		return loginSession.get(sessionId);
	}
	//        
	public void setSessionIdByUserName(String username,String sessionId)
	{
		loginUserSession.put(username, sessionId);
	}
	public void setSessionBySessionId(String SessionId,HttpSession session)
	{
		loginSession.put(SessionId, session);
	}
}


seesionAttributeListener操作を行う:sessionの判断を行う
package cn.java.Listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import cn.java.Cache.LoginCache;

/**
 *     session      ,  HttpSessionAttributeListener    ;
 *           session  ,      session     ;
 *     session   ,             ;
 * @author XXXIERW
 *
 */
public class LoginSessionAttributeListener implements HttpSessionAttributeListener {

	private static final String Login_User = "loginName";//           session     
	@Override
	public void attributeAdded(HttpSessionBindingEvent hsbe) {
		//   session   ,             
		System.out.println("  session    ");
		String attrName = hsbe.getName();//    session   ,    session   
		if(attrName == Login_User)
		{
			//          session
			String attrVal = (String)hsbe.getValue();//  session 
			HttpSession session = hsbe.getSession();
			String sessionId = session.getId();//  session      Id;
			
			//      map sessionId,    
			String sessionId2 = LoginCache.getInstance().getSessionIdByUserName(attrVal);
			if(sessionId2 == null)
			{
				
			}else {
				//            
				HttpSession session2 = LoginCache.getInstance().getSessionBySessionId(sessionId2);
				session2.invalidate();//       session,  session     
			}
			LoginCache.getInstance().setSessionIdByUserName(attrVal, sessionId);//sessionId   
			LoginCache.getInstance().setSessionBySessionId(sessionId, session);
		}
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent hsbe) {
		// TODO Auto-generated method stub

	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent hsbe) {
		// TODO Auto-generated method stub

	}

}

その前にsession操作の内容を理解する必要があります:1.セッションをloginUserNameという名前のセッションとして格納、判断を行う.そして、重複データがあれば前のセッションId識別子を行い、前のクリアを行うと判断する.
これにより、ユーザーがログインを繰り返すとトップ番号操作が可能になります!