java中應用session監聽完成同帳號登錄限制、登錄人數限制。本站提示廣大學習愛好者:(java中應用session監聽完成同帳號登錄限制、登錄人數限制)文章只能為提供參考,不一定能成為您想要的結果。以下是java中應用session監聽完成同帳號登錄限制、登錄人數限制正文
本文重要引見了java中應用session監聽完成同帳號登錄限制、登錄人數限制,詳細代碼以下:
成績域:
1、同帳號登錄:若此帳號已登錄,弗成再次登錄(與QQ形式相反)。
2、登錄人數限制,跨越、已達人數限制則提醒:體系忙碌,稍後再試。
處理思緒:應用HttpSessionAttributeListener監聽器(固然我同時應用了HttpSessionListener不外感到欠好操作)
常識貯備:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeWordStr3個辦法。
對session的setAttribute、removeAttribute將觸發attributeAdd、attributeRemove辦法,對統一個session的統一個attribute停止反復設置將觸發attributeWordStr辦法。
HttpSessionListener欠好操作的緣由:只需拜訪jsp頁面便會創立session(拜訪html其實不會創立session,在server端,如servlet中挪用HttpServletRequest.getSession(true)才會創立),jsp是靜態頁,實質就是個servlet。我的login.jsp明顯是個jsp,當我在監聽器中invalidate一個session,前往登錄頁,立時就又創立了一個session。這是我感到不清晰的處所,工夫沒抵家。
詳細完成:
監聽器代碼
public class OnlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
private static List<SessionAndUser> sessions;
static int delS = -1;
static boolean flag = false;
static {
if (sessions == null) {
sessions = Collections
.synchronizedList(new ArrayList<SessionAndUser>());
}
}
public void sessionCreated(HttpSessionEvent hse) {
System.out.println(hse.getSession() + "-" + new Date());
System.out.println(hse.getSession() + "-" + new Date());
}
public void sessionDestroyed(HttpSessionEvent hse) {
System.out.println("-------------sessionDestroyed()-----------");
System.out.println(hse.getSession() + " "
+ new Date(hse.getSession().getLastAccessedTime()));
System.out.println(hse.getSession() + " " + new Date());
}
public void attributeAdded(HttpSessionBindingEvent e) {
System.out.println("-------------*start added*-----------------------"
+ sessions.size());
HttpSession session = e.getSession();
ActionContext ctx = ActionContext.getContext();
boolean newOne = true;
String attrName = e.getName();
// 登錄
if (attrName.equals(Constant.USER_NAME)) {
// 檢討登錄人數
if (sessions.size() >= Constant.USER_LIMIT) {
newOne = false;
ctx.put("timeoutMSG", "serverBusy");
}
String nowUser = (String) e.getValue();
// 遍歷一切session,檢討能否曾經登錄,若是則提醒曾經登錄
for (int i = sessions.size() - 1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserName().equals(nowUser)) {
newOne = false;
ctx.put("timeoutMSG", "beenLoged");// tem.getSession().invalidate();//
// 同賬號頂替登錄,主動挪用remove
break;
}
}
// 新登錄帳號添加進賬戶保護列表
if (newOne) {
SessionAndUser sau = new SessionAndUser();
sau.setUserName(nowUser);
sau.setSession(session);
sau.setSid(session.getId());
sessions.add(sau);
}
}
}
public void attributeRemoved(HttpSessionBindingEvent e)
throws IllegalStateException {
HttpSession session = e.getSession();
System.out
.println("-------------*start Removed*-----------------------"
+ sessions.size());
if (delS > -1) {
if (flag) {
sessions.remove(delS);
flag = false;
}
} else {
// 登錄
String attrName = e.getName();
if (attrName.equals(Constant.USER_NAME)) {
String nowUser = (String) e.getValue();
// 遍歷一切session
for (int i = sessions.size() - 1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserName().equals(nowUser)) {
sessions.remove(i);
break;
}
}
}
}
}
public void attributeWordStrd(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out
.println("-------------*start replace*-----------------------"
+ sessions.size());
String attrName = e.getName();
delS = -1;
// 登錄
if (attrName.equals(Constant.USER_NAME)) {
// User nowUser = (User) e.getValue();//old value
String nowUser = (String) session.getAttribute(Constant.USER_NAME);// 以後session中的user
// 遍歷一切session
for (int i = sessions.size() - 1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserName().equals(nowUser)
&& !tem.getSid().equals(session.getId())) {
System.out.println("Remove:invalidate 1!");
delS = i;
flag = true;
} else if (tem.getSid().equals(session.getId())) {
tem.setUserName(nowUser);
}
}
if (delS != -1) {
sessions.get(delS).getSession().invalidate();// 掉效時主動挪用了remove辦法。也就會把它從sessions中移除
}
}
}
}
代碼重要思緒是界說一個靜態List<SessionAndUser>寄存session和帳號稱號。
登錄的Action中取得監聽器前往值並處置的代碼
session.setAttribute(Constant.USER_NAME, operator.getUsername());
ActionContext ctx = ActionContext.getContext();
if("serverBusy".equals(ctx.get("timeoutMSG"))){
ctx.put("timeoutMSG", "辦事器忙碌,請稍後再試");
return "jump";
}
if("beenLoged".equals(ctx.get("timeoutMSG"))){
ctx.put("timeoutMSG", "此賬戶在別處登錄");
return "jump";
}
頁面捕捉提醒信息代碼
<%@taglib prefix="s" uri="/struts-tags"%> <s:property value="#attr.timeoutMSG" />
感激浏覽,願望能贊助到年夜家,感謝年夜家對本站的支撐!