日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制

發(fā)布時間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要介紹了java中使用session監(jiān)聽實(shí)現(xiàn)同帳號登錄限制、登錄人數(shù)限制,具體代碼如下:

問題域:

1、同帳號登錄:若此帳號已登錄,不可再次登錄(與QQ模式相反)。

2、登錄人數(shù)限制,超過、已達(dá)人數(shù)限制則提示:系統(tǒng)繁忙,稍后再試。

解決思路:使用HttpSessionAttributeListener監(jiān)聽器(雖然我同時使用了HttpSessionListener不過感覺不好操作)

知識儲備:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeReplace3個方法。

對session的setAttribute、removeAttribute將觸發(fā)attributeAdd、attributeRemove方法,對同一個session的同一個attribute進(jìn)行重復(fù)設(shè)置將觸發(fā)attributeReplace方法。

HttpSessionListener不好操作的原因:只要訪問jsp頁面便會創(chuàng)建session(訪問html并不會創(chuàng)建session,在server端,如servlet中調(diào)用HttpServletRequest.getSession(true)才會創(chuàng)建),jsp是動態(tài)頁,本質(zhì)就是個servlet。我的login.jsp顯然是個jsp,當(dāng)我在監(jiān)聽器中invalidate一個session,返回登錄頁,馬上就又創(chuàng)建了一個session。這是我感覺不清楚的地方,功夫沒到家。

具體實(shí)現(xiàn):

監(jiān)聽器代碼

public class OnlineListener implements HttpSessionListener,

HttpSessionAttributeListener {

private static List sessions;

static int delS = -1;

static boolean flag = false;

static {

if (sessions == null) {

sessions = Collections

.synchronizedList(new ArrayList());

}

}

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)) {

// 檢查登錄人數(shù)

if (sessions.size() >= Constant.USER_LIMIT) {

newOne = false;

ctx.put("timeoutMSG", "serverBusy");

}

String nowUser = (String) e.getValue();

// 遍歷所有session,檢查是否已經(jīng)登錄,若是則提示已經(jīng)登錄

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();//

// 同賬號頂替登錄,自動調(diào)用remove

break;

}

}

// 新登錄帳號添加進(jìn)賬戶維護(hù)列表

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 attributeReplaced(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);// 當(dāng)前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();// 失效時自動調(diào)用了remove方法。也就會把它從sessions中移除了

}

}

}

}

代碼主要思路是定義一個靜態(tài)List存放session和帳號名稱。

登錄的Action中獲得監(jiān)聽器返回值并處理的代碼

session.setAttribute(Constant.USER_NAME, operator.getUsername());

ActionContext ctx = ActionContext.getContext();

if("serverBusy".equals(ctx.get("timeoutMSG"))){

ctx.put("timeoutMSG", "服務(wù)器繁忙,請稍后再試");

return "jump";

}

if("beenLoged".equals(ctx.get("timeoutMSG"))){

ctx.put("timeoutMSG", "此賬戶在別處登錄");

return "jump";

}

頁面捕獲提示信息代碼

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

總結(jié)

以上是生活随笔為你收集整理的java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。