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

本文主要介绍了java中使用session监听实现同帐号登录限制、登录人数限制,具体代码如下:

问题域:

1、同帐号登录:若此帐号已登录,不可再次登录(与qq模式相反)。

2、登录人数限制,超过、已达人数限制则提示:系统繁忙,稍后再试。

解决思路:使用httpsessionattributelistener监听器(虽然我同时使用了httpsessionlistener不过感觉不好操作)

知识储备:httpsessionattributelistener中有attributeadd、attributeremove、attributereplace3个方法。

对session的setattribute、removeattribute将触发attributeadd、attributeremove方法,对同一个session的同一个attribute进行重复设置将触发attributereplace方法。

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

// 检查登录人数

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 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);// 当前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存放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";

}

页面捕获提示信息代码

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

希望与广大网友互动??

点此进行留言吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值